我认为我的问题非常普遍。我想在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)。
我已经失去了很多时间已经尝试了不同的工具和框架,而我正处于考虑从头开始编写反序列化器的地步。
答案 0 :(得分:0)
序列化和反序列化的问题并不十分清楚。大多数Web框架不会将URL查询参数视为JSON对象,而是单独处理每个密钥,并允许您将查询字符串作为字典(或作为请求处理程序的参数,具体取决于框架)进行访问。像>>> array_str = [['2014', '913', '5.78254241807211', '52.3749951170618', '2014', '1', '2024448.00', '89316.00', '29187.00', '427000.00', '60.00', '0'], ['1', '2']]
>>> array_n = [[float(num) for num in item] for item in array_str]
>>> array_n
[[2014.0, 913.0, 5.7825424180721097, 52.3749951170618, 2014.0, 1.0, 2024448.0, 89316.0, 29187.0, 427000.0, 60.0, 0.0], [1.0, 2.0]]
>>>
这样的东西。 JSON通常显示为POST,PUT,PATCH的有效负载以及请求的响应。即使在这种情况下,您也可以将其作为字符串获取并执行类似request.query['name']
的操作来获取Python数据结构,然后您可以使用json-schema或avro验证器库自由验证。
答案 1 :(得分:0)
我想到了两件事。
首先,有一个Eve REST framework,写在Flask之上。
它的作者还创建了一个名为Cerberus的模式/验证语言(并在Eve中使用),它完全符合您的要求。 Eve将您的JSON存储在MongoDB中。
如果您的应用程序不是非常广泛,并且使用开箱即用的Django或包装中已有的各种工具,我会坚持使用Eve。 (哎呀,不打算在这里开始永恒的Django-vs-Flask火焰)
其次,有Mongoengine library为JSON提供Django风格的模式。
它的目的是为Django提供MongoDB的支持,并设计其架构模仿Django的架构。 Mongoengine本身非常稳定,但它与好Django REST Framework,Django REST Framework-Mongoengine的集成绝不是必然的。
此外,还有Mongoengine与Eve和Flask的绑定。
答案 2 :(得分:0)
我环顾四周,找不到我想要的东西。像Marshmallow这样的项目很接近。它们允许规范模式并提供序列化,但我希望jsonschema格式具有互操作性。
所以我围绕一个代表数据的pandas数据框编写了我自己的序列化器/反序列化器类。它有方法