繁体   English   中英

带有(反)序列化器和模式验证的Python JSON REST框架(jsonschema / avro)

[英]Python JSON REST framework with (de)serialiser and schema validation (jsonschema/avro)

我认为我的问题很常见。 我想在Python中构建一个JSON REST API(后面可能还有R),以便在应用程序之间交换数据。 (此时我不想使用BJSON或其他二进制格式)

鉴于模式和(反)序列化框架的可用性,我认为构建一个执行以下操作的系统是直截了当的:

  1. 它需要通过HTTP get请求输入,
  2. 将它转换/解析/反序列化为python对象,
  3. 在给定通用模式语言描述的情况下验证python对象,
  4. 用参数做一些事情来获取结果数据,和
  5. 将结果数据序列化为JSON,
  6. 验证结果json,
  7. 归还它。

我想使用与语言无关的模式语言 - 没有任何只用于一种语言的语言。 我将avro和json-schema视为模式语言和(de)序列化的生态系统,但到目前为止我找不到任何涵盖该法案的工具。 一个特殊的问题是反序列化。 有一些库可以序列化,但是后来有URL GET参数的问题,这些参数是字符串而不是整数。

?名称=米奇年龄= 4

给定一个架构(avro)

{
"type": "record",
"name": "User",
"namespace": "example.avro",
"fields": [
    {
    "name": "name",
    "type": "string"
    },
    {
    "name": "age",
    "type": "int"
    }
]
}

我想得到一个字典(名字='米奇',年龄= 4)。

我已经失去了很多时间已经尝试了不同的工具和框架,我正处于一个阶段,我正在考虑从头开始编写反序列化器。

我环顾四周,没有找到我想要的东西。 Marshmallow等项目接近尾声。 它们允许规范模式并提供序列化,但我希望jsonschema格式具有互操作性。

所以我围绕一个代表数据的pandas数据框编写了我自己的序列化器/反序列化器类。 它有方法

  1. 用于从字典或json对象创建数据帧(反序列化)2。用于强制数据类型,
  2. 用于推断架构,
  3. 用于验证架构,以及
  4. 用于序列化到json。

目前还不是很清楚序列化和反序列化的问题是什么。 大多数Web框架不会将URL查询参数视为JSON对象,而是单独处理每个密钥,并允许您将查询字符串作为字典(或作为请求处理程序的参数,具体取决于框架)进行访问。 request.query['name']这样的东西。 JSON通常显示为POST,PUT,PATCH的有效负载以及请求的响应。 即使在这种情况下,您也可以将其作为字符串获取并执行类似json.loads来获取Python数据结构,然后您可以使用json-schema或avro验证器库进行验证。

我想到了两件事。

首先,在Flask之上编写了一个Eve REST框架

它的作者还创建了一个名为Cerberus的模式/验证语言(并在Eve中使用),它完全符合您的要求。 Eve将您的JSON存储在MongoDB中。

如果您的应用程序不是非常广泛并且使用已经开箱即用的Django或包装中提供的各种工具,我会坚持使用Eve。 (哎呀,不打算在这里开始永恒的Django-vs-Flask火焰)


其次, Mongoengine库为JSON提供了Django风格的模式。

它的目的是为Django提供MongoDB的支持,并设计其架构模仿Django的架构。 Mongoengine本身相当稳定,但它与优秀的 Django REST框架Django REST框架 - Mongoengine的集成绝不是任何方式。

此外,还有Mongoengine与Eve和Flask的绑定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM