我正在使用Flask-RESTful和他们的documentation says用Python编写一个简单的REST API,他们计划不赞成使用对象序列化(reqparse),而支持像marshmallow这样的序列化程序。 我的API正在使用Flask MongoEngine从MongoDB文档存储区进行读写。
我非常感谢一个使用案例的示例,在该案例中,我选择在Document对象的MongoEngine内置序列化程序上使用外部序列化程序,例如棉花糖。
答案 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的dumps
和loads
,否则将无法正确解析。如果是常规JSON,则可以使用任意一个。
答案 1 :(得分:1)
本质区别在于棉花糖会进行验证。
您不只是从Internet获取任何数据并将其填充到数据库中。验证可防止输入错误的数据(恶意或错误)。即使数据来自受信任的用户,也最好对其进行验证以确保数据库完整性。
棉花糖与flask-restplus一样,提供的验证器不仅可以验证类型,还可以验证值(数字的最小/最大,字符串的最小/最大长度,日期的最小/最大等),您甚至可以创建自己的验证器)。
此外,API并不总是全部CRUD。 API和DB之间可能会有一些业务代码,对于这些业务代码来说,拥有Python对象会很不错。 Mongo的BSON解析器不会这样做。
MongoEngine提供了验证,但是它只是在DB之前,而验证应该在输入API时进行。
顺便说一句,烧瓶固定的内部反序列化现在已经计划过时了一段时间,并且事情似乎停滞了(GH issue #9)。我认为有些人正在使用flask-restplus +棉花糖,所以这可能是一条路。
这是另一种选择:
此lib组合不如单片烧瓶-restplus成熟且具有特征,但是使用棉花糖是不错的选择,因为它是一个很棒的lib,并且是因为marshmallow-mongoengine提供的DRY性质。
µMongo是基于棉花糖的MongoEngine的替代产品,因此就像包含了棉花糖mongoengine的MongoEngine。
其documentation的架构说明了验证的不同阶段:客户端和业务对象之间的API,以及对象和数据库之间的ODM。
(免责声明:棉花糖,webargs,apispec和flask-rest-api维护者,µmongo,mongoengine和flask-mongoengine贡献者。)