PyAMF / Django - Flex类映射错误

2 投票
2 回答
1604 浏览
提问于 2025-04-15 11:33

我正在使用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服务方法(这个方法是把Flex中的投资者信息发送到Python)时,我遇到了一个错误'KeyError: first_name'。然后,当我们在Flex的VO(值对象)中添加一个first_name字段时,又出现了last_name的错误。依此类推。

这个错误的意思是,我们的Flex VO必须和我们的Django模型有完全相同的字段。对于简单的对象来说,这没什么问题。但我们使用的是Django的User对象的子类。这就意味着我们的投资者对象也需要一个user_ptr字段,比如说。

注意:我在调用服务方法之前就遇到了所有的错误。

有没有更简单的方法呢?理想情况下,我们希望有一个只包含我们需要字段的Flex投资者VO(这些字段可能来自Django的User或者我们的DjangoInvestor,它是从User扩展而来的)。但现在Flex对象必须完全按照我们的Django对象来建模。我甚至不知道Django的User对象到底长什么样(其实我不应该知道)。

我真的需要一些帮助。非常感谢!:-)

2 个回答

1

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

在0.5.1版本中,处理继承时对于编码Django模型的要求非常严格。它确保每个对象的所有属性都必须被编码,并且在解码请求时,所有属性都必须可用。

这让人很不爽,而在新版本发布后,这种行为已经改变。PyAMF现在对从Flex传递过来的内容要宽容得多。你应该不会再遇到KeyError错误了(如果遇到,那就算是个bug)。

3

这是通过使用 IExternalizable 接口来实现的。

这个接口让你可以明确地写入和读取对象。如果你觉得这和 Java 中的隐式序列化有点像,那就要注意,它不会让你限制默认发送的内容。我没有找到任何关于 PyAMF 的示例。

我找到的关于序列化的最佳文章

撰写回答