[英]Python JSON REST framework with (de)serialiser and schema validation (jsonschema/avro)
我认为我的问题很常见。 我想在Python中构建一个JSON REST API(后面可能还有R),以便在应用程序之间交换数据。 (此时我不想使用BJSON或其他二进制格式)
鉴于模式和(反)序列化框架的可用性,我认为构建一个执行以下操作的系统是直截了当的:
我想使用与语言无关的模式语言 - 没有任何只用于一种语言的语言。 我将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数据框编写了我自己的序列化器/反序列化器类。 它有方法
目前还不是很清楚序列化和反序列化的问题是什么。 大多数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.