Django 与 Flash 的结合! - 带给你更为强大的Web体验

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

1. Django与Flash的结合

{{{Azureon <azureon.netspace@gmail.com> hide details 5:29 pm (40 minutes ago)

}}}[http://groups.google.com/group/python-cn/t/3ae53f6e5ed59ebb Django与Flash的结合@googlegroups.com]

相信大家对于Flash还是很熟悉的,shockwave Flash的浏览器插件在网络上也是相当普及。它的应用很广泛,不仅可以作为浏览器插件,还可以独立于播放器进行播放。从手机到台式机,从游戏应用到教育应用到工作报告都可以用它来表现。它还是一个极富扩展性的RIA客户端,adobe在收购Macromedia公司后,继续强化了Flash的RIA应用。新的ActionScript 3.0将原先的Flash Remoting Components集成后,变成了一个大的flash.net Package。传输格式也由AMF0变成AMF3格式。

Flash可以适用多种网络技术,XML-RPC,SOAP,AMF-RPC.我们这篇主要说的是用Flash AMF-RPC的方式远程调用Django的服务,其它的方式我们以后再说。(例如简单的request和response功能)

既然是python社区,大家应该对Django都比较熟悉,我就不多提了。它是一个提供快速开发web框架。

1.1. Flash 与 Django 的关系

因为Django不涉及前端,而只提供后台服务。Flash也同样,只需要处理前端,并与后台通迅。它们之间通过AMF-RPC的中间件方式直接调用。

AMF-RPC是使用AMF数据格式实现的远程方法调用,它是一个应用程序服务器网关,在Flash应用程序和远程服务之间提供一个相互通迅的网络通道,在这个通道之间舆的是AMF格式的数据。它可以对数据类型自动转换,可以转换成ActionScript代码数据类型,也可以转成服务器程序数据类型。

AMF是一个二进制格式,将Flash程序和后台服务之间的通迅信息序列化,传输速度非常快。

1.1.1. 安装AMF环境

  1. 先装好Django
  2. 然后装上djangoamf-x.x.zip 的模块,这个一个日本人写的。完全由python写的,更新速度还挺快,就是文档还比较少。

这儿是网址: http://djangoamf.sourceforge.jp/index.php?UserManual_en

1.1.2. 创建Django的Flash RIA应用

在settings.py中加上'amf.django.middleware.AMFMiddleware',

例:

MIDDLEWARE_CLASSES = (
   'django.middleware.common.CommonMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.middleware.doc.XViewMiddleware',
   'amf.django.middleware.AMFMiddleware',
)

再加上几个变量设置:

AMF_GATEWAY_PATH = '/gateway/'

AMF_LOG_LEVEL = 'INFO'
AMF_LOG_FILE = '/path/to/log.txt' #这个路径改成实际路径
AMF_LOG_FILE_ENCODING = 'utf8'
AMF_LOG_FILE_MODE = 'a'

然后在views.py中加上需要调用的服务函数, 如sendback 最后在Flash的ActionScript中调用服务。

import remoting.*;
import flash.net.Responder;

var gatewayUrl:String = "http://127.0.0.1/gateway/";
var serviceName:String = "calculateService";
var serviceFactory:ServiceFactory =
ServiceFactory.getInstance(gatewayUrl);
var service:RemotingService = serviceFactory.getService(serviceName);

//trace(service);
send_btn.addEventListener(MouseEvent.MOUSE_UP, clickHandler);
function clickHandler(event:MouseEvent):void {
       var backValue:PendingCall = service.sendback(send_txt.text);   #这个是在
views.py中定义的函数
       backValue.responder = new Responder(handleResult, handleError);
}
function handleResult(ResultEvent:String):void {
       back_txt.text = ResultEvent;
}

function handleError(result:int):void {
       back_txt.text = "handleError is " + String(result);
}
stop();

1.2. 例子

我做了一个例子,在Flash端直接输入python语句,然后直接在Flash端就可以看到服务器端返回的结果。 比如在服务器端输入

a = 5
b = 6
a + b

结果为

5
6
11

这个例子可以用于调试服务器端的程序,直接查询设置服务器端的全局变量,或者执行另一个函数,import 另一个模块。

::-- ZoomQuiet [2007-09-03 11:06:20]

DjangoFlash (last edited 2009-12-25 07:15:25 by localhost)