python - 如果值无效,flask+marshmallow 设置默认值
问题描述
我正在使用 flask+marshmallow 来验证用户有效负载。当收到任何 GET/POST 请求时,我正在应对request.args
或. 下面是代码。request.form
request.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
但没有运气。
解决方案
你必须调用Schema().validate()
方法。而是调用Schema().load(request.args)
总是调用用 . 装饰的方法的方法@post_load
。也不要忘记postprocess = True
在模式的 Metas 类中设置。
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()
.
推荐阅读
- prolog - DTProbLog 查询
- windows - Windows 10 如何猜测 1080p 显示器的物理尺寸?
- python - Django dict键,for循环中的值不起作用
- java - 如何防止快速双击复选框?
- tabulator - 如何将新行添加到 Tabulator 表中?
- c# - 动态创建按钮单击事件不起作用
- javascript - 我正在尝试将数据存储在 sql server 中,但我遇到了一个我不知道如何修复的错误
- google-app-engine - goapp 测试不工作,得到错误“GOPATH must be absolute”,而它是绝对的
- php - 如何使用 Apache、Php 和 Mysql 制作“便携式”Web 应用程序?
- android - 当我点击按钮时应用程序关闭