帮助咱们在HTML中快速生成form标签,同时还能够对用户提交的form请求的数据进行验证。html
pip3 install wtforms
建立对象:构建form标签函数
class LoginForm(Form): name = fields.simple.StringField( label="用户名", validators=[ validators.DataRequired(message="用户名不能为空"), ], widget=widgets.TextInput(), render_kw={"placeholder": "请输入用户名"} ) password = fields.simple.PasswordField( label="密码", validators=[ validators.DataRequired(message="密码不能为空"), validators.Length(min=8, message='用户名长度必须大于%(min)d'), validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}", message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符') ], render_kw={"placeholder": "请输入密码"} )
实例化对象,进行模板渲染ui
# 实例化 form = LoginForm() # HTML {{ form.name.label }} 获取label值 {{ form.name }} 获取input标签 {{form.name.errors[0]}} 获取错误信息 # 标签比较多的,能够循环form {% for foo in form %} <div>{{ foo.label }}:{{ foo }} {{ foo.errors[0] }}</div> {% endfor %}
实例化对象,进行数据验证url
form = LoginForm(POST提交的数据) if form.validate(): # 知足条件, 获取数据 data = form.data else: # 有错误 errors = form.errors
自定义钩子函数spa
# validate_字段名 def validate_name(self, field): # 定义本身的验证 if not field.data.startswith("a"): raise validators.ValidationError("用户名必须以a开头")
from wtforms.csrf.core import CSRF from hashlib import md5 class MyCSRF(CSRF): """ Generate a CSRF token based on the user's IP. I am probably not very secure, so don't use me. """ def setup_form(self, form): self.csrf_context = form.meta.csrf_context() self.csrf_secret = form.meta.csrf_secret return super(MyCSRF, self).setup_form(form) def generate_csrf_token(self, csrf_token): gid = self.csrf_secret + self.csrf_context token = md5(gid.encode('utf-8')).hexdigest() return token def validate_csrf_token(self, form, field): print(field.data, field.current_token) if field.data != field.current_token: raise ValueError('Invalid CSRF') class LoginForm(Form): ...... class Meta: csrf = True csrf_field_name = 'csrf_token' csrf_secret = 'sldfjkjdl' csrf_context = lambda x: request.url csrf_class = MyCSRF # html {{ form.csrf_token }}