返回 首页

wtforms的调用验证方式优化


通常, 在使用flask验证器的过程中视图会有类似下面的语句:

data = request.json
form = ClientForm(data=data)
if form.validate():
    #...
else:
    #...

为了省去视图函数向验证器每次传数据的过程, 重写构造器的时候可以直接使用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对象中, 后续将大大减少代码量.


登录