在该目录中,创建一个名为admin.py的文件,其中包含以下内容:from myapp.subscription.models import Subscribe
from django.contrib import admin
admin.site.register(Subscribe)
现在您已经注册了Subscribe,在命令窗口按CTRL+BREAK 键停止服务器,重新键入python manage.py runserver启动服务器,Django将在管理控制台中识别出Subscribe(参见图3)。

图3. 注册Subscription之后,它将在Django管理控制台中显示
?
开发Flex 4应用程序
您现在已准备好在Flash Builder 4中开发Flex 4接口了。
您可以执行本节中的步骤自行开发Flex应用程序,或者如果您愿意,可以执行以下步骤导入示例项目:
- 下载并提取本教程的示例文件。
- 启动Flash Builder。
- 选择File > Import Flex Project (FXP)。
- 找到并选择Subscription.fxp。
设置用户界面
要启动您自己的Flex应用程序,执行以下步骤:
- 启动Flash Builder。
- 选择File > New > Flex Project
- 为项目输入名称,选择Flex 4 SDK,然后将Application Server Type设置为None/Other。
- 单击Finish。
- 在Design视图中,添加一个TextInput、一个Submit Button、一个List和一个包含标签的Checkbox(参见图4)。

图4. 布局包含一个TextInput、Button、Checkbox和List
您可以按照您喜欢的方式布局元素,但需要设置一些组件属性来将它们连接起来。
- 切换回Source视图。
- 设置元素的id属性、按钮的click属性,以及列表的dataprovider属性,如下面的MXML所示:
<s:layout>
<s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/>
</s:layout>
<s:HGroup>
<s:TextInput id="inputField" width="150" />
<s:Button click="onSend(event)" label="Send"/>
</s:HGroup>
<s:CheckBox label="Email me site updates"
selected="true"
id="receiveUpdates"/>
<s:List id="subscriptionList"
dataProvider="{_list}"
labelField="email"
width="225"
height="100">
<s:layout>
<s:VerticalLayout/>
</s:layout>
</s:List>
添加RemoteObject
要发送和接收ActionScript数据,需要在<fx:Declarations>标记中创建一个RemoteObject对象。RemoteObject类使您能够访问远程服务器上的类。您必须包含一些属性,远程对象才能工作。channelSet是一个Channels数组,用于向目标位置发送消息。(这是在紧挨着RemoteObject上方的ChannelSet标记中定义的。)destination属性是您的网关服务的名称。最后,需要添加服务器端方法的名称。
查看以下示例代码:
<fx:Declarations>
<!-- connection to gateway -->
<s:ChannelSet id="channels">
<s:AMFChannel id="pyamf" uri="http://127.0.0.1:8000/gateway/"/>
</s:ChannelSet>
<s:RemoteObject id="getSubscriptionService"
channelSet="{channels}"
destination="myservice"
showBusyCursor="true"
>
<s:method name="saveEmail"
result="onSaveEmailSuccess(event)"
fault="onFault(event)"/>
<s:method name="getEmailList"
result="onEmailListSuccess(event)"
fault="onFault(event)"/>
</s:RemoteObject>
</fx:Declarations>
创建Subscriber值对象
使用PyAMF的一个重要优势是,能够在服务器端注册您的ActionScript类。可以设置远程对象的数据类型,以便当通过AMF发送它们时,ActionScript已准备好接收强类型数据。这非常适用于使用值对象。
- 在Flash Builder中,右键单击src文件夹并选择New > Package。
- 将包命名为com.subscription.vos。
- 右键单击新包并选择New > ActionScript Class。
- 将该类命名为SubscriberVO。
- 使SubscriberVO属性匹配服务器上的数据模型,例如:
package com.subscription.vos
{
[RemoteClass (alias="com.subscription.vos.SubscriberVO")]
[Bindable]
public class SubscriberVO extends Object
{
public var id:int;
public var email:String;
public var receive_communication:Boolean;
public function SubscriberVO(email:String,receive:Boolean)
{
this.email = email;
this.receive_communication = receive;
}
}
}
要注册您的类供远程使用,必须添加RemoteClass元数据标记。这使该类可在运行时访问。类属性必须与服务器对象匹配。
处理事件
最后您将需要添加一些ActionScript代码来处理事件。
回到项目的主MXML文件中,在<fx:Declarations>后添加以下<fx:Script>块:
<fx:Declarations>:
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.collections.ArrayCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
[ArrayElementType("SubscriberVO")]
[Bindable]
private var _list:ArrayCollection;
private function onSaveEmailSuccess(event:ResultEvent):void
{
getSubscriptionService.getEmailList();
}
private function onFault(event:FaultEvent):void
{
trace(event.fault);
}
private function onEmailListSuccess(event:ResultEvent):void
{
_list = new ArrayCollection( event.result as Array );
}
private function onSend(e:MouseEvent):void
{
getSubscriptionService.saveEmail(inputField.text,receiveUpdates.selected );
}
protected function init(event:FlexEvent):void
{
getSubscriptionService.getEmailList();
}
]]>
</fx:Script>
请注意private property _list:ArrayCollection上方的元数据标记ArrayElementType。这可以确保_list ArrayCollection中的每个对象都具有严格的SubscriberVO类型。
作为最后一步,将creationComplete="init(event)"添加到主Application标记中。在应用程序启动时,init()方法使用电子邮件地址填充该列表。
配置PyAMF网关
接下来您需要设置Python方法,然后注册这些方法以实现前端可访问性。
- 在终端中,更改到myapp目录。
- 创建一个名为amfgateway.py的文件。
- 向新文件添加以下代码:
from pyamf.flex import ArrayCollection,ObjectProxy
from pyamf.remoting.gateway.django import DjangoGateway
from myapp.subscription.models import Subscribe
def saveEmail(request,email,notify):
subscribe = Subscribe()
subscribe.email = email
subscribe.receive_communication = notify
subscribe.save()
return True
def getEmailList(request):
emailList = Subscribe.objects.all()
return emailList
services = {
'myservice.getEmailList':getEmailList,'myservice.saveEmail':saveEmail,}
myGateway = DjangoGateway(services)
这个PyAMF网关包含两个方法,它们提供了添加订阅者和检索订阅者列表的能力。
要使网关可供访问,必须将它的路径模式放在您的url.py文件中。
- 编辑url.py并添加下面的代码:
from django.conf.urls.defaults import patterns,include,url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',# Examples:
# url(r'^$','myapp.views.home',name='home'),# url(r'^myapp/',include('myapp.foo.urls')),# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/',include('django.contrib.admindocs.urls')),# Uncomment the next line to enable the admin:
(r'^admin/',(r'^gateway/','myapp.amfgateway.myGateway'),)
- 重新启动Django。
?
?
参考:
http://www.infoq.com/cn/vendorcontent/show.action?vcr=1240
http://www.kokkowon.com/archives/74