xaajie 发表于 2013-1-30 01:38:13

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 modelsclass Company(models.Model):    name = models.CharField(max_length=80)    def __unicode__(self):      return self.nameclass 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 DjangoGatewayfrom xaajiee.job.models import Company,Jobsdef 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=depIDusersGateway = 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>          <!private var depAC:Array;            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)
    
http://www.agoit.com/upload/attachment/118127/03cefb63-d9a1-36b3-b627-594133a9579e.jpg
 
页: [1]
查看完整版本: Flex+pyAmf+django连接实例