我有以下架构:
class MySchema(Schema):
id = fields.Str()
name = fields.Str()
value = fields.Str()
description = fields.Str()
我想使用 Flask 验证不同类型请求的一些输入数据。
对于 GET 请求,我希望 id 字段为必填字段 (
id = fields.Str(required=True)
)。
对于 POST 请求,我不需要 id 存在,但名称、值和描述字段需要有
required=True
。我知道如何在验证输入数据时排除 id:schema = MySchema(exclude=["id"])
。
对于 PUT 请求,我需要 id 以及名称、值或描述中的至少一项。
我可以只有 3 种不同的模式,但我会尽可能避免这种情况。
我正在思考类似
schema = MySchema(require=["id"])
的事情,我可以在加载架构时动态设置所需的字段。
我找到了一个很好的解决方案,使用模式的
context
属性和 @validates_schema
装饰器。
schema = MySchema()
schema.context["method"] = "POST"
...
schema = MySchema()
schema.context["method"] = "PUT"
在我的架构中:
from marshmallow import Schema, validates_schema, ValidationError, fields
class MySchema(Schema):
id = fields.Str()
name = fields.Str()
value = fields.Str()
description = fields.Str()
@validates_schema
def validate_schema(self, data, **kwargs):
if "method" in self.context:
required_fields = []
missing_fields = []
if self.context["method"] == "POST":
required_fields = ["name", "action", "enabled"]
if self.context["method"] == "PUT":
required_fields = ["id"]
for field in required_fields:
if field not in data:
missing_fields.append(field)
if len(missing_fields) >= 1:
raise ValidationError(["Missing data for required field."], field_name=missing_fields[0])