在学习Flex的过程中,你可能会遇到使用PyAmf来实现Flex与Django的通信方面的问题,这里和大家分享一下,相信本文介绍一定会让你有所收获。
使用PyAmf来实现Flex与Django的通信
三年前,用过AmfPHP与Flash/Flex Remoting做过交互,最近接触Python,公司项目用的Flex做前端,所以接触了PyAmf。PyAmf本质上跟AmfPHP是雷同的。都是通过对AMF协议(ActionScriptMessageFormat)协议的支持来实现对Flash的交互过程。
一、首先,简单的介绍一下AMF协议格式。
AMF是Adobe独家开发出来的通信协议,它采用二进制压缩,序列化、反序列化、传输数据,从而为Flash播放器与Flash
Remoting网关通信提供了一种轻量级的、高效能的通信方式。AMF最大的特色在于可直接将Flash内置对象,例如Object,Array,
Date,XML,传回服务器端,并且在服务器端自动进行解析成适当的对象,这就减轻了开发人员繁复工作,同时也更省了开发时间。它采用二进制编码,可以高度压缩数
据,因此非常适合用来传递大量的资料。数据量越大,FlashRemoting的传输效能就越高,远远超过Web
Service以及使用纯文本的传输方式的XML。
AMF协议是基于Http协议的,它的处理过程大致如下:
1、从客户端获取Http请求(Request)流。
2、对流进行反序列化(Deserialize),得到服务器端程序能够识别的数据,并建立响应(Response)消息。
3、找到相应的远程服务
4、调用服务器端方法,对流进行各种处理得到返回值。
5、序列化响应流
6、将序列化响应流发送Http响应给客户端。
二、安装配置PyAmf和Django
PyAmf目前的稳定版本是0.3,去官方网站下载压缩包,解压文件,执行pythonsetup.pyinstall即可完成安装。
至于Django的安装配置,我前面的文章已经讲过了,详细请参阅http://www.kokkowon.cn/archives/33。
下面我们来开发具体的实际应用。首先简单介绍下pyAMF.django的处理机制。
Pyamf通过pyamf.remoting.gateway.django模块来实现与django
Request、Response相对应处理机制。其中pyamf.remoting.gateway.django.DjangoGateway类是整
个处理流程的主干。我们仅仅需要在django中建立一个DjangoGateway的实例,这个实例通过urlmap对应到响应的处理函数,将把从底层
传递过来的Request解码,并映射到响应的Python对象,然后执行注册的RPC方法,返回一个Response,然后采用AMF协议格式将
Response编码,返回给django,django通过它本身的相关机制,将这个Response以http响应的方式返回给客户端。
1)创建DjangoGateway
首先创建Django项目,然后创建一个应用程序,我这里还叫做app应用,
django-admin.pystartprojectfortest
pythonmanage.pystartappapp
我前面的文章已经讲过了,详细请参阅http://www.kokkowon.cn/archives/33。
定义数据库模型:
app/models.py用于定义我们的数据库模型,将其修改如下:
"""
数据库模型
- @see:U{Djangohomepage(external)<http://djangoproject.com>}
- @author:U{kokkowon<kokko313@gmail.com>}
- @since:0.1.0
- """
- fromdjango.dbimportmodels
- importdatetime
- #MysqlText类型
- classMysqlTextField(models.Field):
- defdb_type(self):
- return'text'
- classFavorite:
- TYPE_CHOICES=(
- ('url','网址'),
- ('music','音频'),
- ('video','视频'),
- )
- type=models.CharField('类型',max_length=30,db_index=True,choices=TYPE_CHOICES)
- title=models.CharField('标题',max_length=250)
- body=models.CharField('内容',default='',max_length=255)
- general=MysqlTextField('描述',default='',blank=True)
- created=models.DateTimeField('添加时间',default=datetime.datetime.now,blank=True)
- def__unicode__(self):
- returnself.title
- classUserFavorite(Favorite,models.Model):
- user_id=models.CharField('用户ID',max_length=250,db_index=True)
- type=Favorite.type
- title=Favorite.title
- body=Favorite.body
- general=Favorite.general
- created=Favorite.created
- classMeta:
- db_table='user_favorites'
- verbose_name='用户收藏夹'
- verbose_name_plural='用户收藏夹列表'
以上定义了一个叫做user_favorites的表。关于Django里面model的定义说明请查看这里:http://docs.djangoproject.com/en/dev/
2)测试PyAmf
在fortest目录下,新建c.py
- frompyamf.remoting.clientimportRemotingService
- importsys
- gateway=RemotingService('http://localhost:8000/app/gateway/')
- adduserfavorite_service=gateway.getService('adduserfavorite')
- edituserfavorite_service=gateway.getService('edituserfavorite')
- userfavorite_service=gateway.getService('userfavorite')
- """
- #添加用户收藏
- """
- rs=adduserfavorite_service('kokko','网址','163','http://www.163.com')
- printrs['id']
- print"----------------------------"
- #编辑用户收藏
- rs=edituserfavorite_service(2,'wwq','视频','sohu','http://www.sohu.com')
- printrs
- print"----------------------------"
- #用户收藏列表
- rs=userfavorite_service('user_id','kokko')
- for_iteminrs:
- print_item.title+''+_item.type+''+_item.user_id+''+_item.body
- print"----------------------------"
- sys.exit(0)
运行服务器:manage.pyrunserver
运行测试程序:pythonc.py将显示响应结果,如下图示例:
证明测试完全通过,Flex端可以使用相关接口和服务器进行通讯了。由于时间关系,我这里不再给出Flash端的实例,等有时间再行补上。
【编辑推荐】
- Flex4beta的Spark布局特性解析
- FlexBuilder4十大新特性闪亮登场
- Flex module用法指南
- Flex4Beta引入新元素功能更强大
- FlexBuilder开发方法及特点解析