使用 PyAMF / Django 实现 Flex 类映射

在这里插入图片描述

1、问题背景

PyAMF 是一个用于在 Flex 和 Python 之间进行通信的库,在使用 PyAMF 与 Flex 应用进行通信时,经常会遇到错误。例如,在发送一个 Flex Investor 对象到 Python 时,会得到一个 ‘KeyError: first_name’ 的错误。这是因为 Flex 对象必须与 Django 模型具有完全相同的字段,否则就会出错。

2、解决方案

为了解决这个问题,可以使用 IExternalizable 接口。IExternalizable 接口允许您显式地写入和读取对象。通过使用 IExternalizable 接口,可以只发送和接收 Flex 对象中需要使用的字段,而无需发送所有字段。

在 PyAMF 0.6b2 版本中,对继承处理进行了修改,现在 PyAMF 对从 Flex 传入的对象更加宽容。您应该不会再收到 KeyError 错误了。

以下是使用 IExternalizable 接口来解决问题的示例代码:

from django.contrib.auth.models import User
from pyamf.flex import *

class Talent(User, IExternalizable):
    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)

    def __externalize__(self):
        return {
            'id': self.id,
            'username': self.username,
            'first_name': self.first_name,
            'last_name': self.last_name,
            'email': self.email,
            'street': self.street,
            'street_nr': self.street_nr,
            'postal_code': self.postal_code,
            'city': self.city,
            'description': self.description,
        }

    @classmethod
    def __internalize__(cls, data):
        talent = cls(**data)
        return talent
```python

在 Flex 端,可以使用以下代码来注册 IExternalizable 类:

```python
[Bindable]
public class Investor extends Externalizable {

    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() {
    }

    override public function writeExternal(output:IExternalizable):void {
        super.writeExternal(output);
        output.writeObject(id);
        output.writeUTF(street);
        output.writeUTF(street_nr);
        output.writeUInt(postal_code);
        output.writeUTF(city);
        output.writeNumber(cash);
        output.writeObject(date_created);
        output.writeObject(date_modified);
        output.writeUTF(username);
        output.writeUTF(password);
        output.writeUTF(email);
    }

    override public function readExternal(input:IExternalizable):void {
        super.readExternal(input);
        id = input.readObject();
        street = input.readUTF();
        street_nr = input.readUTF();
        postal_code = input.readUInt();
        city = input.readUTF();
        cash = input.readNumber();
        date_created = input.readObject() as Date;
        date_modified = input.readObject() as Date;
        username = input.readUTF();
        password = input.readUTF();
        email = input.readUTF();
    }

}

使用 IExternalizable 接口可以解决 Flex 类映射的问题,从而实现 PyAMF 与 Flex 应用的无缝通信。

相关推荐

  1. 关于C# 使用 sqlite 映射实体笔记

    2024-07-16 08:52:03       50 阅读
  2. [CSS]使用flex实现二联三联布局

    2024-07-16 08:52:03       31 阅读
  3. .NET Core 将实体转换为 SQL(ORM 映射)

    2024-07-16 08:52:03       37 阅读
  4. html中flex使用

    2024-07-16 08:52:03       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 08:52:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 08:52:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 08:52:03       58 阅读
  4. Python语言-面向对象

    2024-07-16 08:52:03       69 阅读

热门阅读

  1. 初学者指南:如何搭建和配置 Nginx 服务器

    2024-07-16 08:52:03       22 阅读
  2. Canvas

    2024-07-16 08:52:03       23 阅读
  3. 增加扫地机器人的智能化功能

    2024-07-16 08:52:03       24 阅读
  4. 网络爬虫Scrapy shell 的使用和介绍

    2024-07-16 08:52:03       26 阅读
  5. 卡码网语言基础课 | 10. 平均绩点

    2024-07-16 08:52:03       24 阅读
  6. RoCE-SAN和RoCE区别

    2024-07-16 08:52:03       21 阅读
  7. CSS基础

    2024-07-16 08:52:03       20 阅读
  8. C# 继承

    2024-07-16 08:52:03       26 阅读
  9. 设计模式-三大分类

    2024-07-16 08:52:03       18 阅读
  10. JVM常见面试题2

    2024-07-16 08:52:03       23 阅读