Flex+pyAmf+django联接实例
安装后台语言环境及其步骤见官方网站
python http://www.python.org/download/
django. http://www.djangoproject.com/download/
pyAmf http://pyamf.org/wiki/Download
该例使用django+pyAmf+Flex,数据库使用Django自带的数据库sqlite3,以及其自带的server
一 安装好环境后,部署
1新建一个工程(工程名xaajiee)
命令行模式敲入django-admin.py startproject xaajiee
进入项目目录Cd xaajiee
2新建一个应用 manage.py startapp job
在应用文件夹中的models.py中建立数据模型,编辑该文件
建立两个表: company公司表,存放公司名称
Jobs职位表,存放职位信息。并建立外键关系。
from django.db import models class Company(models.Model): name = models.CharField(max_length=80) def __unicode__(self): return self.name class Jobs(models.Model): id=models.CharField(max_length=8,primary_key=True) title= models.CharField(max_length=40) address=models.CharField(max_length=40) dep = models.ForeignKey(Company) def __unicode__(self): return self.title
3激活应用并配置数据库文件:修改Setting.py
DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = './data.db'
。。。。
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'xaajiee.job',
)
4自动创建表结构 python manage.py syncdb
提示输入超级用户密码
5进入python shell
写入Company表数据
>>>from xaajiee.job.models import Company,Jobs
>>>dep1=Company(name='11company')
>>>dep1.save()
>>>dep2=Company(name='22company')
>>>dep2.save()
写入jobs表数据
>>>dep1.jobs_set.create(id='001',title='aaa',address='beijing')
>>>dep1.jobs_set.create(id='002',title='bbb',address='beijing')
>>>dep2.jobs_set.create(id='011',title='ccc',address='beijing')
>>>dep2.jobs_set.create(id='012',title='ddd',address='beijing')
5搭建Flex和Django的桥梁:PyAmf已安装(注:如果是python2.5版本执行下面语句安装)
python setup.py install --disable-ext
接着在我们的Django工程目录下创建一个amfgateway.py文件
from pyamf.remoting.gateway.django import DjangoGateway from xaajiee.job.models import Company,Jobs def getAllCompany(request): return Company.objects.all() def getDepAllJobs(request,depID): dep=Company.objects.get(id=depID) return dep.jobs_set.all() def updateJobs(request,jobsID,jobsTitle,depID): jobs=Jobs.objects.get(id=jobsID) jobs.title=jobsTitle jobs.depID=depID usersGateway = DjangoGateway({ 'amfp.getDepAllJobs':getDepAllJobs, 'amfp.getAllCompany':getAllCompany, 'amfp.updateJobs':updateJobs })
6修改urls.py 写入:
(r'^xaajiee/gateway/', 'xaajiee.amfgateway.usersGateway'),
二 Flex端
1新建services-config.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="amfp"> <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://localhost:8000/xaajiee/gateway/" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
@@编译该文件:工程右键属性 Flex Compiler添加内容
-locale en_US -services "services-config.xml"
@@注意其中的destination的id与amfgateway文件中的调用一致
usersGateway = DjangoGateway({
'amfp.getDepAllJobs':getDepAllJobs,
'amfp.getAllCompany':getAllCompany,
'amfp.updateJobs':updateJobs
2 mxml文件内容
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="getAllCompany()" fontSize="12"> <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; [Bindable] private var depAC:Array; [Bindable] private var jobsAC:Array; //AsyncToken很酷的特性就是它是动态类。这意味着,当你进行远程调用时可以添加属性到token上,然后result/fault处理函数中读取这些属性。 private function getAllCompany():void{ var token:AsyncToken=djangoService.getAllCompany(); token.addResponder(new AsyncResponder(AfterGetDeps,falutHandler)); } private function AfterGetDeps(result:Object, token:Object=null):void{ var evt:ResultEvent=result as ResultEvent; depAC=evt.result as Array; } private function doQueryJobs():void{ var token:AsyncToken=djangoService.getDepAllJobs(dep_cb.selectedItem.id); token.addResponder(new AsyncResponder(AfterGetJobs,falutHandler)); } private function AfterGetJobs(result:Object, token:Object=null):void{ var evt:ResultEvent=result as ResultEvent; jobsAC=evt.result as Array; } private function falutHandler(error:Object, token:Object=null):void{ var evt:FaultEvent=error as FaultEvent; Alert.show(evt.message.toString()); } ]]> </mx:Script> <mx:RemoteObject id="djangoService" destination="amfp" showBusyCursor="true"/> <mx:Panel title="用户管理"> <mx:DataGrid dataProvider="{jobsAC}"> <mx:columns> <mx:DataGridColumn dataField="id" headerText="序号" width="100"/> <mx:DataGridColumn dataField="title" headerText="职位" width="200"/> </mx:columns> </mx:DataGrid> <mx:ControlBar> <mx:ComboBox id="dep_cb" dataProvider="{depAC}" labelField="name" width="148"/> <mx:Button label="查询" click="doQueryJobs()"/> </mx:ControlBar> </mx:Panel> </mx:Application>
run application最终运行结果页面:
(别忘了启动服务器 进入工程目录 manage.py runserver)