如何使用 Flask-Marshmallow 处理文件上传验证?

How to handle file upload validations using Flask-Marshmallow?

我正在与 Flask-Marshmallow 合作,以验证 Flask app 中的 requestresponse 模式。当存在 IntStrFloat 等简单字段时,我能够对 request.formrequest.args 进行简单验证

我有一个案例需要使用表单字段上传文件 - file_field。它应该包含文件内容。

如何验证此字段是否存在以及文件格式是什么等

Marshmallow 中是否有我可以像 fields.Int()fields.Str()

这样使用的字段

我已经阅读了文档 here 但没有找到任何此类字段。

您可以使用 fields.Raw:

import marshmallow

class CustomSchema(marshmallow.Schema):
  file = marshmallow.fields.Raw(type='file')

如果您使用的是 Swagger,您会看到类似这样的内容:

然后在您的view中您可以使用flask.request.files访问文件内容。

有关完整示例和更高级的主题,请查看我的 project

您可以使用 FieldRaw 字段来表示一般字段,然后为该字段设置正确的 OpenAPI 属性(即 typeformat) .

在 OpenAPI 3 中,您应该将 type 设置为 string 而不是 file,然后将 format 设置为 binarybyte根据您的文件内容:

from marshmallow import Schema, fields


class MySchema(Schema):
  file = fields.Raw(metadata={'type': 'string', 'format': 'binary'})

有关详细信息,请参阅 docs

顺便说一句,从 marshmallow 3.10.0 开始,使用关键字参数传递 OpenAPI 属性(descriptiontypeexample 等)已被弃用,并将在marshmallow 4,使用 metadata 字典来传递它们。