我什么时候会使用像 marshmallow 这样的外部序列化器而不是 monogoengine 的内置 JSON 序列化(from_json 和 to_json)?

Arj*_*man 3 python mongoengine flask flask-restful marshmallow

我正在使用Flask-RESTful在 Python 中编写一个简单的 REST API ,他们的文档说他们计划弃用对象序列化 (reqparse),转而使用像Marshmallow这样的序列化程序 我的 API 正在使用Flask MongoEngine 从 MongoDB 文档存储中读取和写入。

我非常感谢一个用例的示例,在该用例中,我选择使用外部序列化器(例如 Marshmallow),而不是 Document 对象上的 MongoEngine 内置序列化器。

Jér*_*ôme 6

本质的区别在于marshmallow 进行了验证

\n

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

\n

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

\n

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

\n

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

\n
\n

顺便说一句,flask-restful 中的内部[反|]序列化已经被预定弃用一段时间了,而且事情似乎陷入了停滞(GH Issue #9)。我认为有人使用flask-restplus + marshmallow,所以这可能是一种可行的方法。

\n

这是一个替代方案:

\n
    \n
  • 使用 Marshmallow 进行 I/O [反|]序列化
  • \n
  • 使用marshmallow-mongoengine从 MongoEngine 模式尽可能自动创建 Marshmallow API 模式
  • \n
  • 使用webargs解析参数(将 Flask 请求参数注入 Marshmallow 模式)
  • \n
  • 使用apispec来记录遵循 OpenAPI 标准的规范
  • \n
  • 为了让事情变得更容易,使用flask-smorest隐藏webargs/apispec层并提供一个漂亮的界面。
  • \n
\n

这个库组合不像整体式flask-restplus那么成熟和特色,但是使用marshmallow很好,因为它是一个很棒的库并且因为DRY ness。

\n
\n

\xc2\xb5Mongo 是基于 marshmallow 的 MongoEngine 的替代品,因此它就像包含 marshmallow-mongoengine 的 MongoEngine。

\n

它的文档有一个模式,说明了验证的不同阶段:客户端和业务对象之间的 API,以及对象和数据库之间的 ODM。

\n
\n

(免责声明:marshmallow、webargs、apispec 和flask-rest-api 维护者、\xc2\xb5mongo、mongoengine 和flask-mongoengine 贡献者。)

\n