3.5 WTForms参数验证

WTForms 是一款优秀的参数验证框架。可以将参数验证抽离出一个模块。与业务代码解耦。

使用pipenv引入WTForms

pipenv install wtforms

使用WTForms需要自定义一个类继承wtforms提供的Form类,然后定义参数校验规则

from wtforms import Form, StringField, IntegerField
from wtforms.validators import Length, NumberRange



class SearchForm(Form):
    # 参数校验规则:
    # 1.定义的属性名q,page要与要校验的参数同名
    # 2.根据要传入的参数类型选择不同的Field类进行实例化
    # 3.传入一个数组,作为校验规则validators
    # 4.可以设置默认值
    q = StringField(validators=[DataRequired(), Length(min=1, max=30,message="查询关键字长度必须在1-30之间")], )
    page = IntegerField(validators=[NumberRange(min=1, max=99)], default=1)

使用WTForms book.py

@web.route("/book/search/")
def search():
    """
    搜索书籍路由
    """
    # 实例化我们自定义的SearchForm,需要传入一个字典作为要校验的参数
    form = SearchForm(request.args)
    # validate()方法返回True/False来标示是否校验公国
    if not form.validate():
        # errors为错误信息提示(上面定义的message)
        return jsonify(form.errors)

    # 从form中获取校验后的参数,不从request里拿,因为我们可能会对数据进行预处理或者默认值的给定
    q = form.q.data.strip()
    page = form.page.data
    isbn_or_key = is_isbn_or_key(q)
    if isbn_or_key == 'isbn':
        result = YuShuBook.search_by_isbn(q)
    else:
        result = YuShuBook.search_by_key(q)

    return jsonify(result)

Last updated