使用PyAmf來(lái)實(shí)現(xiàn)Flex與Django的通信
在學(xué)習(xí)Flex的過(guò)程中,你可能會(huì)遇到使用PyAmf來(lái)實(shí)現(xiàn)Flex與Django的通信方面的問(wèn)題,這里和大家分享一下,相信本文介紹一定會(huì)讓你有所收獲。
使用PyAmf來(lái)實(shí)現(xiàn)Flex與Django的通信
三年前,用過(guò)AmfPHP與Flash/Flex Remoting做過(guò)交互,最近接觸Python,公司項(xiàng)目用的Flex做前端,所以接觸了PyAmf。PyAmf本質(zhì)上跟AmfPHP是雷同的。都是通過(guò)對(duì)AMF協(xié)議(ActionScriptMessageFormat)協(xié)議的支持來(lái)實(shí)現(xiàn)對(duì)Flash的交互過(guò)程。
一、首先,簡(jiǎn)單的介紹一下AMF協(xié)議格式。
AMF是Adobe獨(dú)家開(kāi)發(fā)出來(lái)的通信協(xié)議,它采用二進(jìn)制壓縮,序列化、反序列化、傳輸數(shù)據(jù),從而為Flash播放器與Flash
Remoting網(wǎng)關(guān)通信提供了一種輕量級(jí)的、高效能的通信方式。AMF最大的特色在于可直接將Flash內(nèi)置對(duì)象,例如Object,Array,
Date,XML,傳回服務(wù)器端,并且在服務(wù)器端自動(dòng)進(jìn)行解析成適當(dāng)?shù)膶?duì)象,這就減輕了開(kāi)發(fā)人員繁復(fù)工作,同時(shí)也更省了開(kāi)發(fā)時(shí)間。它采用二進(jìn)制編碼,可以高度壓縮數(shù)
據(jù),因此非常適合用來(lái)傳遞大量的資料。數(shù)據(jù)量越大,F(xiàn)lashRemoting的傳輸效能就越高,遠(yuǎn)遠(yuǎn)超過(guò)Web
Service以及使用純文本的傳輸方式的XML。
AMF協(xié)議是基于Http協(xié)議的,它的處理過(guò)程大致如下:
1、從客戶端獲取Http請(qǐng)求(Request)流。
2、對(duì)流進(jìn)行反序列化(Deserialize),得到服務(wù)器端程序能夠識(shí)別的數(shù)據(jù),并建立響應(yīng)(Response)消息。
3、找到相應(yīng)的遠(yuǎn)程服務(wù)
4、調(diào)用服務(wù)器端方法,對(duì)流進(jìn)行各種處理得到返回值。
5、序列化響應(yīng)流
6、將序列化響應(yīng)流發(fā)送Http響應(yīng)給客戶端。
二、安裝配置PyAmf和Django
PyAmf目前的穩(wěn)定版本是0.3,去官方網(wǎng)站下載壓縮包,解壓文件,執(zhí)行pythonsetup.pyinstall即可完成安裝。
至于Django的安裝配置,我前面的文章已經(jīng)講過(guò)了,詳細(xì)請(qǐng)參閱http://www.kokkowon.cn/archives/33。
下面我們來(lái)開(kāi)發(fā)具體的實(shí)際應(yīng)用。首先簡(jiǎn)單介紹下pyAMF.django的處理機(jī)制。
Pyamf通過(guò)pyamf.remoting.gateway.django模塊來(lái)實(shí)現(xiàn)與django
Request、Response相對(duì)應(yīng)處理機(jī)制。其中pyamf.remoting.gateway.django.DjangoGateway類是整
個(gè)處理流程的主干。我們僅僅需要在django中建立一個(gè)DjangoGateway的實(shí)例,這個(gè)實(shí)例通過(guò)urlmap對(duì)應(yīng)到響應(yīng)的處理函數(shù),將把從底層
傳遞過(guò)來(lái)的Request解碼,并映射到響應(yīng)的Python對(duì)象,然后執(zhí)行注冊(cè)的RPC方法,返回一個(gè)Response,然后采用AMF協(xié)議格式將
Response編碼,返回給django,django通過(guò)它本身的相關(guān)機(jī)制,將這個(gè)Response以http響應(yīng)的方式返回給客戶端。
1)創(chuàng)建DjangoGateway
首先創(chuàng)建Django項(xiàng)目,然后創(chuàng)建一個(gè)應(yīng)用程序,我這里還叫做app應(yīng)用,
django-admin.pystartprojectfortest
pythonmanage.pystartappapp
我前面的文章已經(jīng)講過(guò)了,詳細(xì)請(qǐng)參閱http://www.kokkowon.cn/archives/33。
定義數(shù)據(jù)庫(kù)模型:
app/models.py用于定義我們的數(shù)據(jù)庫(kù)模型,將其修改如下:
"""
數(shù)據(jù)庫(kù)模型
- @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','網(wǎng)址'),
- ('music','音頻'),
- ('video','視頻'),
- )
- type=models.CharField('類型',max_length=30,db_index=True,choices=TYPE_CHOICES)
- title=models.CharField('標(biāo)題',max_length=250)
- body=models.CharField('內(nèi)容',default='',max_length=255)
- general=MysqlTextField('描述',default='',blank=True)
- created=models.DateTimeField('添加時(shí)間',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='用戶收藏夾列表'
以上定義了一個(gè)叫做user_favorites的表。關(guān)于Django里面model的定義說(shuō)明請(qǐng)查看這里:http://docs.djangoproject.com/en/dev/
2)測(cè)試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','網(wǎng)址','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)
運(yùn)行服務(wù)器:manage.pyrunserver
運(yùn)行測(cè)試程序:pythonc.py將顯示響應(yīng)結(jié)果,如下圖示例:
證明測(cè)試完全通過(guò),F(xiàn)lex端可以使用相關(guān)接口和服務(wù)器進(jìn)行通訊了。由于時(shí)間關(guān)系,我這里不再給出Flash端的實(shí)例,等有時(shí)間再行補(bǔ)上。
【編輯推薦】
- Flex4beta的Spark布局特性解析
- FlexBuilder4十大新特性閃亮登場(chǎng)
- Flex module用法指南
- Flex4Beta引入新元素功能更強(qiáng)大
- FlexBuilder開(kāi)發(fā)方法及特點(diǎn)解析