PyAMF / Django - Flex类映射错误

时间:2009-05-13 08:51:47

标签: python django flex pyamf

我正在使用PyAmf与Flex应用程序进行通信。但我一直都有错误。

我的模特:

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字段。 注意:我在服务方法之前得到了所有错误。

有更简单的方法吗?理想情况下,我们会有一个Flex Investor VO,只包含我们使用的字段(无论是来自Django用户还是来自Investor的django User)。但是现在我们的Django对象之后必须完全建模Flex对象。我甚至不知道Django User对象的确切含义(我不应该这样)。

我真的可以使用一些帮助。非常感谢提前: - )

2 个答案:

答案 0 :(得分:3)

这是使用IExternalizable接口完成的。

它允许您显式写入和读取对象。如果这与Java隐式序列化类似,则不会限制默认发送的内容。我无法通过PyAMF找到任何这方面的例子。

关于序列化的

Best post我发现了。

答案 1 :(得分:1)

随着PyAMF 0.6b2的发布,我终于可以回答这个问题。

0.5.1在编写Django模型时处理继承的方式非常严格。它确保所有属性都保证在每个对象上进行编码 - 并且期望在解码请求时所有属性都可用。

这很糟糕,随着新版本的发布,行为现在已经改变了。对于你从Flex手中提供的内容,PyAMF对很多更加宽容。您不应再出现KeyError错误(如果您这样做,则会将其视为错误)。