Sealyu

--- 博客已迁移至: http://www.sealyu.com/blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  618 随笔 :: 87 文章 :: 225 评论 :: 0 Trackbacks
这两天在学习Google AppEngine的时候, 需要写一个小程序,就是简单的从数据库里读出数据,然后显示出来。
界面使用flex的,所以数据通信是想到了用amf,搜索到了两个python的开源产品--pyAmf和Django Amf,后来看到Django Amf更新的并不频繁,所以最后选了pyAmf。

pyAmf还有一个优点是官方网站推荐了几篇django与flex通信的文章里有一篇是中文的,哈哈。。。我喜欢中文。。。链接见
http://blog.eshangrao.com/index.php/2008/02/16/447-flexpyamfdjango

我的程序参考的也就是这篇文章,但代码写完后,程序并没有通过,而是一直报找不到服务,折腾了两天终于搞出来了。

Django 服务端,

1. 新建立一个工程testAMF,然后建立一个app--dailystory.

2. 修改settings.py
   将dailystory添加到INSTALLED_APPS中。
   配置数据库。

3. 工程目录中( whatidisplay 文件夹里 )的urls.py 的相关代码如下:
Python代码
  1. from django.conf.urls.defaults import *  
  2. import settings  
  3.   
  4. urlpatterns = patterns('',  
  5.     (r'^dailystory/', include('testAMF.dailystory.urls')),  
  6.     (r'^admin/', include('django.contrib.admin.urls')),  
  7.     )  


4. 在dailystory文件夹中添加一个urls.py文件
Python代码
  1. from django.conf.urls.defaults import *  
  2.   
  3. urlpatterns = patterns('',  
  4.     (r'^gateway/$', 'testAMF.dailystory.amfgateway.storyGateway'),  
  5.     (r'^(.*)$', 'django.views.static.serve', {'document_root':'dailystory/flex'}),  
  6.     )  


5. 修改dailystory文件夹中的models.py 文件
Python代码
  1. from django.db import models  
  2.   
  3. class DailyStory(models.Model):  
  4.     content = models.TextField()  
  5.   
  6.     def __unicode__(self):  
  7.         return self.title  
  8.   
  9.     class Admin:  
  10.         pass  

6. 在dailystory文件夹中添加一个amfgateway.py文件
Python代码
  1. from pyamf.remoting.gateway.django import DjangoGateway  
  2. from dailystory.models import DailyStory  
  3.   
  4. def getDailyStory(request):  
  5.     return DailyStory.objects.all()  
  6.   
  7.   
  8. storyGateway = DjangoGateway({  
  9.     'dailystory.getDailyStory': getDailyStory,  
  10.  })  

Django的服务端就大功告成了


Flex端更简单
Java代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
  3.     layout="absolute" creationComplete="initApp();">  
  4.       
  5.     <mx:Script>  
  6.         <![CDATA[  
  7.             import flash.events.NetStatusEvent;  
  8.               
  9.             import mx.collections.ArrayCollection;  
  10.             import mx.rpc.AsyncToken;  
  11.             import mx.rpc.AsyncResponder;  
  12.             import mx.rpc.events.FaultEvent;  
  13.             import mx.rpc.events.ResultEvent;             
  14.               
  15.             private function initApp():void  
  16.             {  
  17.                   
  18.                     var token:AsyncToken=djangoService.getDailyStory();  
  19.                 token.addResponder(new AsyncResponder(onGetDailyStory,faultHandler));  
  20.             }  
  21.               
  22.             private function onGetDailyStory(re:ResultEvent, token:Object=null):void  
  23.             {  
  24.                 var stories:Array = re.result as Array;  
  25.                 var storyCollection:ArrayCollection = new ArrayCollection(stories);  
  26.                 yesterdayStory.text = storyCollection.getItemAt(0).content;  
  27.             }  
  28.               
  29.             private function faultHandler(fe:FaultEvent, token:Object=null):void  
  30.             {  
  31.                 trace(fe.fault.faultDetail);  
  32.             }  
  33.         ]]>  
  34.     </mx:Script>  
  35.       
  36.     <mx:RemoteObject  
  37.         id="djangoService"  
  38.         destination="dailystory"  
  39.         showBusyCursor="true">  
  40.     </mx:RemoteObject>  
  41.       
  42.     <mx:TextArea id="yesterdayStory" x="582" y="130" height="118" width="242"/>  
  43. </mx:Application>  


然后需要在于与上述flex文件同目录中新建一个services-config.xml
Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <services-config>  
  3.     <services>  
  4.         <service id="dailyStoryService" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">  
  5.             <destination id="dailystory">  
  6.                 <channels>  
  7.                     <channel ref="dailyStoryChannel"/>  
  8.                 </channels>  
  9.                 <properties>  
  10.                     <source>*</source>  
  11.                 </properties>  
  12.             </destination>  
  13.         </service>  
  14.     </services>  
  15.     <channels>  
  16.         <channel-definition id="dailyStoryChannel" class="mx.messaging.channels.AMFChannel">  
  17.             <endpoint uri="http://localhost:8080/dailystory/gateway/" class="flex.messaging.endpoints.AMFEndpoint"/>  
  18.         </channel-definition>  
  19.     </channels>  
  20. </services-config>  


在编译时注意添加编译参数-services services-config.xml

然后将编译后生成的在bin-debug文件夹中的文件复制到whatidisplay"dailystory"flex文件夹里

运行django服务器
Java代码
  1. manage.py runserver 8080  

访问http://localhost:8080/dailystory/DailyStory.html



这里与我参考的文章不同的有两点,估计是pyAMF的更新造成的。我用的pyamf版本是0.3.1.
第一个是在amfgateway.py文件中
Java代码
  1. storyGateway = DjangoGateway({  
  2.     'dailystory.getDailyStory': getDailyStory,  
  3.  })  

我在给DjangoGateway赋值时使用了appName.method--即dailystory.getDailyStory
据官方说这可能是个bug;)具体参看http://www.pyamf.org/wiki/DjangoHowto中的May be some problems here

另外一处是 services-config.xml 文件中,我的destination id 给的就是django中App的名字。如果起其他名字的话,最后flex总是得不到服务。很奇怪。
posted on 2009-05-01 23:36 seal 阅读(652) 评论(0)  编辑  收藏 所属分类: Flex+ActionScript

只有注册用户登录后才能发表评论。


网站导航: