2


0

PyAMF / Django - Flexクラスマッピングエラー

私はFlexアプリと通信するためにPyAmfを使っています。 しかし、私はエラーを受け続けています。

私のモデル:

from django.contrib.auth.models import User

class Talent(User):
    street = models.CharField(max_length=100)
    street_nr = models.CharField(max_length=100)
    postal_code = models.PositiveIntegerField()
    city = models.CharField(max_length=100)
    description = models.CharField(max_length=100)

私のゲートウェイファイル:

from pyamf.remoting.gateway.django import DjangoGateway
from addestino.bot.services import user
from addestino.bot.models import *
from django.contrib.auth.models import User
import pyamf

pyamf.register_class(User, 'django.contrib.auth.models.User')
pyamf.register_class(Talent, 'addestino.bot.models.Talent')

services = {
    'user.register': user.register,
    'user.login': user.login,
    'user.logout': user.logout,
}

gateway = DjangoGateway(services, expose_request=True)

Flex Talentオブジェクト:

package be.addestino.battleoftalents.model
{
    [Bindable]
    public class Investor
    {
    public static var ALIAS : String = 'be.addestino.battleoftalents.model.Investor';

    public var id:Object;
    public var street:String;
    public var street_nr:String;
    public var postal_code:uint;
    public var city:String;
    public var cash:Number;
    public var date_created:Date;
    public var date_modified:Date;
    public var username:String;
    public var password:String;
    public var email:String;

    public function Investor()
    {
    }
}

}

Flexが私の register servicemethod(flex Investorをpythonに送るメソッド)を呼ぶと、エラー` 'KeyError:first_name' が出ます。 それから、Flex VOに `first_name`フィールドを追加すると、 last_name`エラーが発生します。 等々。 このエラーは私たちのflex VOが私たちのdjangoモデルと全く同じフィールドを持たなければならないことを意味します。 単純なオブジェクトでは、これは問題になりません。 しかし、我々はdjangoのUserオブジェクトのサブクラスを使います。 そしてそれは私達の投資家も例えば `user_ptr`フィールドを必要とすることを意味します。 注:servicemethodの前にすべてのエラーが出ます。

もっと簡単な方法はありますか? 理想的には、私たちが使用するフィールドのみを持つFlex Investor VOがあるでしょう(それらがDjangoユーザーからのものであろうと、 `User`から拡張するdjangoの「Investor」からのものであろうと)。 しかし現時点では、FlexオブジェクトはDjangoオブジェクトに忠実にモデル化する必要があります。 私はDjango Userオブジェクトがどんなものであるのか正確には知りません(私はそうすべきではありません)。

私は本当に助けを借りることができました。 どうもありがとうございました:-)

2 Answer


3


これはIExternalizableインターフェイスを使用して行われます。

それはあなたが明示的にオブジェクトを書いたり読んだりすることを可能にします。 これがJavaの暗黙的シリアル化に似ている場合は、デフォルトで送信される内容を制限することはできません。 私はPyAMFでこれの例を見つけることができませんでした。

http://www.brooksandrus.com/blog/2008/03/25/flex-air-serialization-lessons-learned/[ベスト投稿]シリアル化について私が見つけた。


1


PyAMF 0.6b2のリリースで、私はついにこの質問に答えることができます。

Djangoモデルのエンコーディングに関して、0.5.1は継承をどのように扱うかという点で非常に厳密でした。 すべてのプロパティが各オブジェクトで確実にエンコードされるようにし、要求をデコードするときにすべてのプロパティが使用可能になるようにしました。

これは吸い込まれて、振る舞いは今新しいバージョンのリリースで変わりました。 PyAMFは、あなたがFlexから何を手に入れたかについてもっと寛容です。 あなたはもう `KeyError`エラーを受け取るべきではありません(そしてもしあなたがそうするならば、それはバグと見なされます)。