PyAmf配置

http://blog.eshangrao.com/2008/02/16/447/

搭建Flex和Django的桥梁:PyAmf的安装

以上我们已经准备好了后台环境,创建了初始的数据,那么我们的Flex程序如何与Django交互呢,答案是PyAmf,这个是Python的Amf实现,通过他,Flex就可以使用Amf的方式和Python程序交互。值得一提的是,这个支持Amf3。

PyAmf目前的稳定版本是0.1,和前面安装Django一样的考虑,我们也安装svn的开发版本

cd $work_root/server
svn co http://svn.pyamf.org/pyamf/trunk pyamf-trunk
cd pyamf-trunk
sudo python setup.py develop

接着在我们的Django工程目录下创建一个amfgateway.py文件,内容如下:

from pyamf.remoting.gateway.django import DjangoGateway
from ananas.users.models import Department,User

def getAllDepartments(request):
return Department.objects.all()

def getDepAllUsers(request,depID):
dep=Department.objects.get(id=depID)
return dep.user_set.all()

def updateUser(request,userID,userName,depID):
user=User.objects.get(id=userID)
user.name=userName
user.depID=depID

usersGateway = DjangoGateway({
'getDepAllUsers': getDepAllUsers,
'getAllDepartments':getAllDepartments,
'updateUser':updateUser
})

以上定义了一个userGateway Amf网关,提供了三个分别获取所有部门、用户和更新用户信息的方法。

接着打开$work_root/server/src/ananas/urls.py,定义AMF网关的访问URL,用于Flex端访问。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
# Example:
# (r'^ananas/', include('ananas.foo.urls')),

# Uncomment this for admin:
# (r'^admin/', include('django.contrib.admin.urls')),
(r'^ananas/gateway/', 'ananas.amfgateway.usersGateway'),
)

以上定义对/ananas/gateway的访问,使用usersGateway进行处理。(注意,这个urls.py是Django里面的最经典的东西,这样可以使用正则表达式,定义非常灵活的URL处理)

接着我们来进行Flex端的开发。

首先,为了代码分离的考虑,我们将后台Django服务配置的设置单独存放在services-config.xml文件里面:

[xml]
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
<services>
<service id="ananasService" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
<destination id="ananasAmf">
<channels>
<channel ref="ananasChannel"/>
</channels>
<properties>
<source>*</source>
</properties>
</destination>
</service>
</services>
<channels>
<channel-definition id="ananasChannel" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://127.0.0.1/ananas/gateway/" class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
</channels>
</services-config>

注意,其中<endpoint />里面的uri地址就是我们前面在Django的urls.py中定义的PyAMF网关访问URL地址一致。

下面是一个简单的Flex的测试代码:

[xml]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="getAllDepartment()">
<mx:Script>
<![CDATA[
import mx.rpc.AsyncToken;
import mx.rpc.AsyncResponder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;

private function getAllDepartment():void{
var token:AsyncToken=djangoService.getAllDepartments();
token.addResponder(new AsyncResponder(AfterGetDeps,falutHandler));
}
[Bindable]
private var depAC:Array;
private function AfterGetDeps(result:Object, token:Object=null):void{
var evt:ResultEvent=result as ResultEvent;
depAC=evt.result as Array;
}
private function falutHandler(error:Object, token:Object=null):void{
var evt:FaultEvent=error as FaultEvent;
Alert.show(evt.message.toString());
}

[Bindable]
private var userAC:Array;
private function doQueryUser():void{
var token:AsyncToken=djangoService.getDepAllUsers(dep_cb.selectedItem.id);
token.addResponder(new AsyncResponder(AfterGetUsers,falutHandler));
}
private function AfterGetUsers(result:Object, token:Object=null):void{
var evt:ResultEvent=result as ResultEvent;
userAC=evt.result as Array;
}
]]>
</mx:Script>
<mx:RemoteObject
id="djangoService"
destination="ananasAmf"
showBusyCursor="true"/>
<mx:Panel title="用户管理">
<mx:DataGrid dataProvider="{userAC}">
<mx:columns>
<mx:DataGridColumn dataField="id" headerText="员工号" width="100"/>
<mx:DataGridColumn dataField="name" headerText="姓名" width="200"/>
</mx:columns>
</mx:DataGrid>
<mx:ControlBar>
<mx:ComboBox id="dep_cb" dataProvider="{depAC}" labelField="name"/>
<mx:Button label="查询" click="doQueryUser()"/>
</mx:ControlBar>
</mx:Panel>
</mx:Application>

注意其中,<RemoteObject/>的destination=”ananasAmf”与我们前面的services-config.xml中定义的<destination id=”ananasAmf”>一致。

注意编译以上程序的时候,请使用“-services services-config.xml”参数加载Service配置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值