我何时会在monogoengine的内置JSON序列化(from_json和to_json)上使用像棉花糖这样的外部序列化器?

时间:2018-10-03 10:37:35

标签: python flask mongoengine flask-restful marshmallow

我正在使用Flask-RESTful和他们的documentation says用Python编写一个简单的REST API,他们计划不赞成使用对象序列化(reqparse),而支持像marshmallow这样的序列化程序。 我的API正在使用Flask MongoEngine从MongoDB文档存储区进行读写。

我非常感谢一个使用案例的示例,在该案例中,我选择在Document对象的MongoEngine内置序列化程序上使用外部序列化程序,例如棉花糖。

2 个答案:

答案 0 :(得分:1)

Mongo使用BSON,并且它们有一个用python实现的dedicated parser util
来源:

反序列化:

from bson.json_util import loads
loads('[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]')

# >>> [{u'foo': [1, 2]}, {u'bar': {u'hello': u'world'}}, {u'code': Code('function x() { return 1; }', {})}, {u'bin': Binary('...', 128)}]

序列化:

from bson import Binary, Code
from bson.json_util import dumps
dumps([{'foo': [1, 2]},
       {'bar': {'hello': 'world'}},
       {'code': Code("function x() { return 1; }", {})},
       {'bin': Binary(b"")}])

# >>> '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]'

当您尝试序列化/反序列化的对象是BSON时,您需要使用mongo的dumpsloads,否则将无法正确解析。如果是常规JSON,则可以使用任意一个。

答案 1 :(得分:1)

本质区别在于棉花糖会进行验证

您不只是从Internet获取任何数据并将其填充到数据库中。验证可防止输入错误的数据(恶意或错误)。即使数据来自受信任的用户,也最好对其进行验证以确保数据库完整性。

棉花糖与flask-restplus一样,提供的验证器不仅可以验证类型,还可以验证值(数字的最小/最大,字符串的最小/最大长度,日期的最小/最大等),您甚至可以创建自己的验证器)。

此外,API并不总是全部CRUD。 API和DB之间可能会有一些业务代码,对于这些业务代码来说,拥有Python对象会很不错。 Mongo的BSON解析器不会这样做。

MongoEngine提供了验证,但是它只是在DB之前,而验证应该在输入API时进行。


顺便说一句,烧瓶固定的内部反序列化现在已经计划过时了一段时间,并且事情似乎停滞了(GH issue #9)。我认为有些人正在使用flask-restplus +棉花糖,所以这可能是一条路。

这是另一种选择:

  • 使用棉花糖进行I / O [反|]序列化
  • 使用marshmallow-mongoengine从MongoEngine模式中尽可能自动地创建棉花糖API模式
  • 使用webargs解析参数(将烧瓶请求参数注入棉花糖模式)
  • 使用apispec记录遵循OpenAPI标准的规范
  • 为使事情变得简单,请使用flask-rest-apiflask-apispec隐藏webargs / apispec层并提供一个不错的界面。

此lib组合不如单片烧瓶-restplus成熟且具有特征,但是使用棉花糖是不错的选择,因为它是一个很棒的lib,并且是因为marshmallow-mongoengine提供的DRY性质。


µMongo是基于棉花糖的MongoEngine的替代产品,因此就像包含了棉花糖mongoengine的MongoEngine。

documentation的架构说明了验证的不同阶段:客户端和业务对象之间的API,以及对象和数据库之间的ODM。


(免责声明:棉花糖,webargs,apispec和flask-rest-api维护者,µmongo,mongoengine和flask-mongoengine贡献者。)