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

















 
 
 


 
 
 
 