1.安装
pip install WTForms
2.关键概念
·Forms是WTForms库的核心容器,它包含一系列的Fields,可通过属性或字典样式访问;
·Fields是最主要的表单处理单元,每一种表单数据类型对应着一种Field,Filed还包含一些有用的属性,如:标签、描述信息、验证错误信息等;
·每一个Field都有一个Widget实例,用于生成该Field的HTML元素;
·Field还包含一个Validators列表,用于指定该字段的验证规则。
3.使用示例
base.py
from wtforms import Form
from flask import request
from app.abnormal.error_code import ParameterException
class BaseForm(Form):
def __init__(self):
data = request.json
super(BaseForm, self).__init__(data=data)
def validate_for_api(self) -> object:
valid = super(BaseForm, self).validate()
if not valid:
raise ParameterException(msg=self.errors)
return self
forms.py
#扩展表单项示例
from wtforms import StringField, IntegerField, DateTimeField, FieldList, DateField, FormField, FloatField
from wtforms import Form as WTForm
from wtforms.validators import DataRequired, Email, NumberRange
from app.validators.base import BaseForm as Form
class TaskOderlListIn(WTForm):
order_id = IntegerField(validators=[]) # 订单id
class QueryIn(Form):
type = StringField(validators=[])
status = IntegerField(validators=[])
sale_price = FloatField()
start_date = DateTimeField(validators=[DataRequired()])
start_product_valid_term = DateField(validators=[])
order_list = FieldList(FormField(TaskOderlListIn)) # 订单列表
order_state = FieldList(IntegerField(validators=[]))
create.py
#在视图函数中使用表单
@api.route(‘/create‘, methods=[‘POST‘])
@auth.login_required
def create_channel():
form = QueryIn().validate_for_api()
type = form.type.data
status = form.status.data
sale_price = form.sale_price.data
start_product_valid_term = form.start_product_valid_term.data
order_list = form.order_list.data
order_state = form.order_state.data
for item in order_list:
order_id = item.order_id.data
4.常用Validators
conn_type = IntegerField(validators=[DataRequired(message=None), NumberRange(min=1, max=2, message=None)])
说明 | |
---|---|
DataRequired(message=None) | field值必须传递 |
Email(message=None) | field值是否为email地址 |
EqualTo(fieldname, message=None) | field的值是否与fieldname对应field的值相同 |
InputRequired(message=None) | 验证用户是否输入了内容 |
IPAddress(ipv4=True, ipv6=False, message=None) | 验证是否为IP地址 |
Length(min=-1, max=-1, message=None) | 验证输入的字符串长度是否在指定范围内 |
MacAddress(message=None) | 验证是否为MAC地址 |
NumberRange(min=None, max=None, message=None) | 验证数值是否在指定范围内 |
Optional(strip_whitespace=True) | 指定当前field为可选,停止对其进行验证 |
Regexp(regex, flags=0, message=None) | 使用正则表达式验证当前field |
URL(require_tld=True, message=None) | 验证是否为URL地址 |
UUID(message=None) | 验证是否为UUID字符串 |
AnyOf(values, message=None, values_formatter=None) | 验证输入值是否为values之一 |
NoneOf(values, message=None, values_formatter=None) | 验证输入值是否不是values中任何一个 |
5.自定义validators
custom_validators.py
from wtforms import ValidationError
class Length(object):
def __init__(self, min=-1, max=-1, message=None):
# 定义validator初始化输入
self.min = min
self.max = max
if not message:
message = u‘Field must be between %i and %i characters long.‘ % (min, max)
self.message = message
def __call__(self, form, field):
l = field.data and len(field.data) or 0
if l < self.min or self.max != -1 and l > self.max:
raise ValidationError(self.message)
forms.py
from wtforms import StringField
from wtforms import Form as WTForm
from wtforms.validators import DataRequired, Email, NumberRange
from app.validators.base import BaseForm as Form
from app.validators.custom_validators import Length
class MyForm(Form):
# 4. 使用自定义validator Length
name = StringField(‘Name‘, [InputRequired(), Length(max=50)])