Sealyu

--- 博客已迁移至: http://www.sealyu.com/blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  618 随笔 :: 87 文章 :: 225 评论 :: 0 Trackbacks

pyamf与django整合,机制及源码分析

开始研究pyamf的用处了。
pyamf(http://www.pyamf.org)是一个很好的amf中间件,能跟django, twisted, google app engine等流行框架整合。现在我要做的就是pyamf结合django 1.0。据说flex通过amf做PRC调用似乎节省掉很多带宽。
下载
去官网找到svn地址,checkout下来之后install,很简单。python真是一种很简洁很强大的语言,和flex很配啊。
处理机制
既然跟django结合,就应该有一套处理request,response的机制。pyamf里对应的就是 pyamf.remoting.gateway.django模块。打开能看到有一个类class DjangoGateway(gateway.BaseGateway),它就是整个处理流程的主干。class document很好的解释了它在django中的用法。仅仅需要在views.py中建立一个DjangoGateway实例,这个实例是urlmap 对应的处理函数,它把从django底层传递过来的request(其实是AMF编码过的)解码,并映射相应的python对象,然后执行注册的RPC方 法(就是flex调用amf过程中看到的方法调用)返回一个response,最后用AMF机制编码这个response,返回给django。这样 django再通过层层处理返回这个AMF信息给flex。如此便是一个完整的amf PRC调用过程。很多的server基本上都是基于类似的机制,通过中间件层层过滤request和response,达到隔离底层处理的目的。最后我们 能看到,django内部处理amf的调用是如此之简单。
DjangoGateway有两个方法很重要,一个是__call__(python的特殊名字方法,自己定义的方法不能用这些名字哦,__call__ 使得对象能像方法那样用,比如有对象a,执行a()相当于执行a.__call__()。也许可以猜到了,没错,在django里urlmap需要有一个 对应的处理函数,__call__就是起这个处理函数的作用)。还有一个就是getResponse方法。它的作用是处理解码后的request,这是一 些很普通的方法调用,因为request已经AMF解码了,它会寻找合适的PRC方法(选择的依据就是AMF指定的方法名,也就是flex调用amf url时的方法名)来处理request。我把这两个方法贴上来了。里面重点扯了一下__call__加深印象。

def getResponse(self, http_request, request):
"""
Processes the AMF request, returning an AMF response.
 
@param http_request: The underlying HTTP Request.
[...]



以下示例使用的Django和PyAMF版本是从SVN下载的最新版本,版本号分别是:9084和1699。
Django的安装和配置可以从前面的文章找到,PyAMF的安装也是很简单:sudo python setup.py install。
首先在urls.py中增加一行:
(r^'gateway$', 'project.application.amfgateway.gw'),
在application的目录下创建afmgateway.py:
#coding=utf-8
from pyamf.remoting.gateway.django import DjangoGateway
import project.application.views as views

services = {
    'echo' = views.echo,
}

gw = DjangoGateway(services)
在views.py文件增加如下函数:
def echo(request, data):
    return data
在Flex里面连接的办法很普通:
var gateway : NetConnection = new NetConnection();
gateway.connect("http://yousite/gateway");
var resonder : Responder = new Responder(onResult, onFault);
gateway.call("echo", responder, "hello");

其实一切都很简单吧,我调试的时候却费了好多时间,只是在urls.py的映射中写成了
r^'gateway/$'
posted on 2009-05-01 19:19 seal 阅读(942) 评论(0)  编辑  收藏 所属分类: Flex+ActionScript

只有注册用户登录后才能发表评论。


网站导航: