wtforms的调用验证方式优化
通常, 在使用flask验证器的过程中视图会有类似下面的语句:
data = request.json
form = ClientForm(data=data)
if form.validate():
#...
else:
#...
-
重写的目的:
-
无需每次在视图中使用
data=reqeust.data, form = XXForm(data=data)
获取和传入请求数据. -
无需在视图中使用ifelse判断, 请求数据有问题时候, 直接向客户端返回异常.
-
分析:
为了省去视图函数向验证器每次传数据的过程, 重写构造器的时候可以直接使用request.data获取; 为了直接返回异常, 需要重写validate, 此处我们不重写, 直接定义一个类似的方法, 去调用validate.
from flask import request
from wtforms import Form
# 这是之前定义的参数错误异常处理类
from app.libs.error_code import ParameterException
class BaseForm(Form):
def __init__(self):
data = request.json
super(BaseForm, self).__init__(data=data)
def validate_for_api(self):
valid = super(BaseForm, self).validate()
if not valid:
# 这里如果出错将直接跑出异常, 视图中将免除了判断并使用ifelse的麻烦
raise ParameterException(msg=self.errors)
return self
这时候, 继承这个类的验证表单如果验证参数有问题, 将会'自动向客户端返回一个异常json数据, 而无需在后续使用raise, 因为在验证器已经将错误raise出去了.
在form定义的表单可以直接继承自定义的基础表单, 不在继承wtfforms的原始表单, 如:
class ClientForm(BaseForm):
#...
secret = StringField(validators=[...])
之后在视图中如果需要验证变方便的多, 如:
@api.route('/register', methods=['POST'])
def create_client():
form = ClientForm().validate_for_api()
return Success()
视图中不在需要使用if判断参数是否合法, 也不需要将request数据当做参数传到form对象中, 后续将大大减少代码量.