【问题标题】:flask+marshmallow set default value if value is invalid如果值无效,flask+marshmallow 设置默认值
【发布时间】:2019-09-18 12:44:03
【问题描述】:

我正在使用 flask+marshmallow 来验证用户有效负载。当收到任何 GET/POST 请求时,我将处理 request.argsrequest.formrequest.req_data。下面是代码。

class BaseMethodView(MethodView):

    view_template = None


    def __init__(self, *args, **kwargs):
        assert issubclass(self.validator_class, core_validator.BaseValidator), (
            "Invalid validator found."
        )
        assert issubclass(self.service_class, BaseService), "Invalid Service found."
        assert self.view_template, "Template not defined"
        super().__init__(*args, **kwargs)

    def validate(self, payload, *args, **kwargs):
        self.validator_class().validate(payload)

    def process_request(self):
        search_data = self.service_class(request).execute()
        return render_template(self.view_template, data=search_data)

    def get(self):
        request.req_data = request.args.copy()
        self.validate(request.req_data)
        return self.process_request()

    def post(self):
        request.req_data = request.form.copy()
        self.validate(request.req_data)
        return self.process_request()

要求-在验证器中,我正在验证字段。如果某些字段值无效,那么我想设置为默认值而不是引发任何异常。怎么办?

class CategoryField(fields.String):
    def _deserialize(self, value, attr, data, **kwargs):
        if value not in ("choice1", "choice2", "choice3"):
            return "choice1"
        super()._deserialize(value, attr, data)


class SearchValidator(core_validator.BaseValidator):
    query = fields.Str(required=True)
    cat = CategoryField()

    class Meta:
        strict = True
        skip_on_field_errors=False
        # INCLUDE: pass those keys/values as is, with no validation performed
        unknown = INCLUDE

如果不是棉花糖,那么你能推荐一些其他更好的图书馆吗?我也在尝试marshmallow.decorators.post_dump,但没有运气。

【问题讨论】:

    标签: python python-3.x flask marshmallow


    【解决方案1】:

    您必须调用Schema().validate() 方法。而是调用Schema().load(request.args) 方法,该方法总是调用用@post_load 装饰的方法。也不要忘记在 Metas 类模式中设置postprocess = True

    class SearchValidator(core_validator.BaseValidator):
        query = fields.Str(required=True)
        cat = CategoryField()
    
        class Meta:
            strict = True
            skip_on_field_errors=False
            # INCLUDE: pass those keys/values as is, with no validation performed
            unknown = INCLUDE
            postprocess = True
    

    调用时,使用SearchValidator().load(payload) 而不是SearchValidator().validate()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 2022-06-11
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多