wtforms的调用验证方式优化

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

data = request.json
form = ClientForm(data=data)
if form.validate():
    #...
else:
    #...
  • 重写的目的:
  1. 无需每次在视图中使用data=reqeust.data, form = XXForm(data=data)获取和传入请求数据.
  2. 无需在视图中使用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对象中, 后续将大大减少代码量.