这两天在学习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. urlpatterns = patterns(”,
  4. (r’^dailystory/’, include(‘testAMF.dailystory.urls’)),
  5. (r’^admin/’, include(‘django.contrib.admin.urls’)),
  6. )

4. 在dailystory文件夹中添加一个urls.py文件

Python代码
  1. from django.conf.urls.defaults import *
  2. urlpatterns = patterns(”,
  3. (r’^gateway/$’, ‘testAMF.dailystory.amfgateway.storyGateway’),
  4. (r’^(.*)$’, ‘django.views.static.serve’, {‘document_root’:’dailystory/flex’}),
  5. )

5. 修改dailystory文件夹中的models.py 文件

Python代码
  1. from django.db import models
  2. class DailyStory(models.Model):
  3. content = models.TextField()
  4. def __unicode__(self):
  5. return self.title
  6. class Admin:
  7. pass


6. 在dailystory文件夹中添加一个amfgateway.py文件

Python代码
  1. from pyamf.remoting.gateway.django import DjangoGateway
  2. from dailystory.models import DailyStory
  3. def getDailyStory(request):
  4. return DailyStory.objects.all()
  5. storyGateway = DjangoGateway({
  6. ‘dailystory.getDailyStory’: getDailyStory,
  7. })


Django的服务端就大功告成了

Flex端更简单

Java代码
  1. layout=”absolute” creationComplete=”initApp();”>
  2. import flash.events.NetStatusEvent;
  3. import mx.collections.ArrayCollection;
  4. import mx.rpc.AsyncToken;
  5. import mx.rpc.AsyncResponder;
  6. import mx.rpc.events.FaultEvent;
  7. import mx.rpc.events.ResultEvent;
  8. private function initApp():void
  9. {
  10. var token:AsyncToken=djangoService.getDailyStory();
  11. token.addResponder(new AsyncResponder(onGetDailyStory,faultHandler));
  12. }
  13. private function onGetDailyStory(re:ResultEvent, token:Object=null):void
  14. {
  15. var stories:Array = re.result as Array;
  16. var storyCollection:ArrayCollection = new ArrayCollection(stories);
  17. yesterdayStory.text = storyCollection.getItemAt(0).content;
  18. }
  19. private function faultHandler(fe:FaultEvent, token:Object=null):void
  20. {
  21. trace(fe.fault.faultDetail);
  22. }
  23. ]]>
  24. id=”djangoService”
  25. destination=”dailystory”
  26. showBusyCursor=”true”>

然后需要在于与上述flex文件同目录中新建一个services-config.xml

Xml代码
  1. *

在编译时注意添加编译参数-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赋值时使用了<span style=”color: blue;”>appName.method–即<span style=”color: blue;”>dailystory.getDailyStory

据官方说这可能是个bug;)具体参看http://www.pyamf.org/wiki/DjangoHowto中的May be some problems here

另外一处是 services-config.xml 文件中,我的destination id 给的就是django中App的名字。如果起其他名字的话,最后flex总是得不到服务。很奇怪。

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注