当前位置: 首页 > news >正文

python的flex服务端数据接口开发

python的flex服务端数据接口开发

python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类。这方面我更加推荐用twisted来写这个网关,因为twisted有很好的异步机制。

下面的我写的一个简单的验证用户的python服务端:

______________________________
DBServer.py

# Copyright (c) 2009-2010 The Newjh Project.
"""
@author: Roy
@since: 0.1.0
"""   

import os.path

import ConfigParser

cfg = ConfigParser.SafeConfigParser()
cfg.read('settings.cfg')

from twisted.internet import reactor
from twisted.web import server as _server, static, resource
from twisted.enterprise import adbapi

from pyamf.remoting.gateway.twisted import TwistedGateway

from newjh import newjhService



root = resource.Resource()
gw = TwistedGateway({'newjh': newjhService(adbapi.ConnectionPool('MySQLdb',
host=cfg.get('db','host'), user=cfg.get('db','user'),
passwd=cfg.get('db','password'), db=cfg.get('db','database'),
cp_reconnect=True,use_unicode=True, charset='utf8'))},     expose_request=False)

root.putChild('gateway', gw)
root.putChild('crossdomain.xml', static.File(os.path.join(os.getcwd(),
os.path.dirname(__file__), 'crossdomain.xml'), defaultType='application/xml'))

server = _server.Site(root)

reactor.listenTCP(8000, server)

reactor.run()

————————————————
newjh.py

"""
Newjh remoting service.

@since: 0.1.0
"""   

from datetime import datetime
from urlparse import urlparse
import re

from twisted.internet import defer
from twisted.internet.task import LoopingCall

import pyamf 
from pyamf.flex import ArrayCollection, ObjectProxy
from pyamf.remoting.gateway import expose_request

EMAIL_RE = r"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$"

# This is MySQL specific, make sure that if you use a different database server
# this is updated to ensure sql injection attacks don't occur 
def sql_safe(value):
if isinstance(value, basestring):
return value.replace("'", "\\'")
elif isinstance(type(value), (int, float)):
return value

raise TypeError, 'basestring, int or float expected' 

def is_valid_url(url):
o = urlparse(url)

# scheme
if o[0] == '':
return (False, 'Scheme required')

if o[1] == '':
return (False, 'Hostname required')

return (True, None)

def is_valid_email(email):
"""
A very basic email address format validator
"""
if re.match(EMAIL_RE, email) != None:
return True

return False



def build_message(row):
m = User()
m.ID = row[0]
m.UserName = row[1]
m.Password = row[2]
return m

class User:
pass

pyamf.register_class(User, 'newjh.User')

class newjhService(object):
def __init__(self, pool):
self.conn_pool = pool
LoopingCall(self._keepAlive).start(3600, False)

def _keepAlive(self):
print 'Running Keep Alive...'
self.conn_pool.runOperation('SELECT 1')



def getUser(self, username, password):
"""
Gets all approved messages.
"""
print 'username : %s passwrd : %s' % (username, password)
def cb(rs):
print rs
ret = [ObjectProxy(build_message(row)) for row in rs]
print ret
return ArrayCollection(ret)

def eb(failure):
# TODO nick: logging
return ArrayCollection()

d = self.conn_pool.runQuery("SELECT * FROM user where " + \
"UserName= '" +username + "' and Password = '" + \
password +"'" ).addErrback(eb).addCallback(cb)

return d
——————————————————
crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

——————————————————

settings.cfg
[db]
host:         localhost
user:         root
password:     *********
database:    newjh

————————————————————————
————————————————————————
flex 客户端:

客户端先建立联接,然后就可以向服务端call了,回调写在onResult
要注意的是gateway / newjh.getUser 和服务端要对应好
基类 extends NetConnection

connect("http://127.0.0.1:8000/gateway");
addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);

responder = new Responder(onResult);

call(“newjh.getUser”, responder, event.data["name"], event.data["pass"]);

转载于:https://www.cnblogs.com/L-H-R-X-hehe/p/3812660.html

相关文章:

  • Ruby Web框架
  • js千分位的函数
  • SVN 安装到vs2010及SVN的用法
  • SpringMVC 中HttpMessageConverter简介和Http请求415 Unsupported Media Type的问题
  • Arcgis 10.1中空间连接功能
  • SQL SERVER索引
  • 浅谈C++多态性
  • Ubuntu12.04下使用valgrind内存测试工具测试Qt程序
  • 占位符的使用
  • OpenFlow协议标准演进过程
  • 收集与测试相关的所有工具
  • ORACLE优化器RBO与CBO介绍总结
  • 那些踩过的坑
  • 数学图形(1.44)超圆
  • ASP.NET MVC之单元测试分分钟的事
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • exif信息对照
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • STAR法则
  • V4L2视频输入框架概述
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 动态规划入门(以爬楼梯为例)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 一个JAVA程序员成长之路分享
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​Python 3 新特性:类型注解
  • #LLM入门|Prompt#3.3_存储_Memory
  • #宝哥教你#查看jquery绑定的事件函数
  • $(function(){})与(function($){....})(jQuery)的区别
  • (003)SlickEdit Unity的补全
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (算法)求1到1亿间的质数或素数
  • (原創) 未来三学期想要修的课 (日記)
  • .chm格式文件如何阅读
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 托管代码与非托管代码
  • .NET建议使用的大小写命名原则
  • .php文件都打不开,打不开php文件怎么办
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • [2021 蓝帽杯] One Pointer PHP
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [CF]Codeforces Round #551 (Div. 2)
  • [CF482B]Interesting Array
  • [CSS]CSS 的背景
  • [CSS3备忘] transform animation 等