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.
[...]