2006年10月23日

Python | Django AMF

JavaにはOpenAMFS2Flex2、PHPにはamfphpがオープンソースのAMF実装としてあるけど、PythonのAMF実装は2004年のアルファ版で開発が止まったまま。

こうなったら自分で作るしかないと思い立ち、amfphpとS2Flex2を参考にPythonでAMFを扱えるモジュールを書いてます。Djangoと統合して動くようにDjango用のミドルウェア込みで。

実はさっき知ったのだけど、WebORB for RoRというRubyのAMF実装もあっんだね。こっちを参考に作ればよかった。。。

まだAMF0しか扱えないし、やりとりするオブジェクトのクラスマッピングをどうするか決めてない状態だけど、近々公開しようと思います。いずれAMF3もサポートしたい。とか言ってる間にWebORB for Pythonがリリースされそうですが。

で、Django AMFはなんとなく以下のようなコードになります。

・project_name/settings.py
middleware_classes = (
    'django.middleware.common.commonmiddleware',
    'django.contrib.sessions.middleware.sessionmiddleware',
    'django.contrib.auth.middleware.authenticationmiddleware',
    'django.middleware.doc.xviewmiddleware',
    'amf.middleware.amfmiddleware',  # AMF用のミドルウェアを設定
)

REMOTING_GATEWAY_PATH = '/RemotingGateway/'  # ゲートウェイURLのパスを設定
・project_name/urls.py
urlpatterns = patterns('',
    # 「ゲートウェイURLパス/サービス名/メソッド名」がマッピング用のURLとなる。
    (r'RemotingGateway/SampleService/add', 'project_name.app_name.views.add'),

    # メソッド名を()でグループ化し、ビューメソッドとして'amf.django.views'を指定すると、
    # オプションとして指定した'project_name.app_name.views'モジュール中で
    # グループと一致する関数が実行されます。自称「オートマッピング」
    (r'RemotingGateway/SampleService/(.*)', 'amf.django.views', {'views':'project_name.app_name.views'}),
)
・project_name/app_name/views.py
def add(request, a, b):
    return a + b  # Flashに返したい値をそのまま返すだけ

def getNow(request):
    import datetime
    return datetime.datetime.now()  # datetimeオブジェクトは自動的にFlashのDateオブジェクトに変換されます。
・Flash
var sampleService:Service = new Service(
    "http://127.0.0.1:8080/RemotingGateway/", // ゲートウェイURLを指定
    null,
    "SampleService", // サービス名を指定
    null,
    null);

addPc:PendingCall = sampleService.add(1, 2) // リモートメソッドの呼出
addPc.responder = new RelayResponder(this, addResult, handleError);
function addResult(re:ResultEvent) {
    trace(re.result); // '3'が出力される。
}

nowPc:PendingCall = sampleService.getNow(); // オートマッピングにより関数が呼び出される。
nowPc.responder = new RelayResponder(this, getNowResult, handleError);
function getNowResult(re:ResultEvent) {
    trace(re.result): // re.resultはDateオブジェクト。現在の日時が出力される。
}

function handleError(fault:FaultEvent) {
  // エラーを処理
}
Posted by otsuka : 17:10 | Comment (0) | Trackback (0)
Comment









名前、アドレスを登録しますか?