PyAMF / Django - ошибки отображения классов Flex - PullRequest
2 голосов
/ 13 мая 2009

Я использую 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'. Затем, когда мы добавляем поле first_name в наш Flex VO, мы получаем ошибку last_name. И так далее. Эта ошибка означает, что у нашего flex VO должны быть те же поля, что и у наших моделей django. С простыми объектами это не будет проблемой. Но мы используем подклассы объекта User django. А это значит, что нашему Инвестору также необходимо, например, поле user_ptr. Примечание: я получаю все ошибки до обслуживания.

Есть ли более простой способ? В идеале у нас должен быть Flex Investor VO только с теми полями, которые мы используем (будь то от пользователя Django или нашего django Investor, который простирается от User). Но прямо сейчас объекты Flex должны быть смоделированы именно после наших объектов Django. Я даже не знаю точно, как выглядит объект Django User (чего я не должен).

Я действительно мог бы помочь. Большое спасибо заранее: -)

Ответы [ 2 ]

3 голосов
/ 14 мая 2009

Это делается с помощью интерфейса IExternalizable.

Позволяет явно писать и читать объекты. Если это похоже на неявную сериализацию Java, она не позволит вам ограничить то, что отправляется по умолчанию. Мне не удалось найти никаких примеров этого с PyAMF.

Лучший пост о сериализации, который я нашел.

1 голос
/ 13 августа 2010

С выпуском PyAMF 0.6b2 я наконец могу ответить на этот вопрос.

0.5.1 был довольно строг в том, как он обрабатывает наследование, когда дело доходит до кодирования моделей Django. Он гарантировал, что все свойства гарантированно были закодированы для каждого объекта, и ожидал, что все свойства были доступны при декодировании запроса.

Это отстой, и теперь поведение изменилось с выходом новой версии. PyAMF намного более прост, что вы передаете из Flex. Вы не должны больше получать ошибку KeyError (и если это так, она считается ошибкой).

...