安装后台语言环境及其步骤见官方网站
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)

本文介绍如何使用Django框架结合PyAMF和Flex实现前后端分离的应用开发,包括环境搭建、数据库配置及操作、Flex与Django交互等内容。
1083

被折叠的 条评论
为什么被折叠?



