简介

  帮助我们在HTML中快速生成form标签,同时还可以对用户提交的form请求的数据进行验证。

安装

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": "请输入密码"}
)
 

  实例化对象,进行模板渲染

# 实例化
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 %}

  实例化对象,进行数据验证

form = LoginForm(POST提交的数据)
if form.validate():
# 满足条件, 获取数据
data = form.data
else:
# 有错误
errors = form.errors

钩子

  自定义钩子函数

# validate_字段名
def validate_name(self, field):
# 定义自己的验证
if not field.data.startswith("a"):
raise validators.ValidationError("用户名必须以a开头")

CSRF

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 }}

最新文章

  1. Windows Azure一些小技巧集合
  2. mongodb存储过程
  3. CC150 - 11.5
  4. julia下载QQ.jl
  5. Html5新标签及用法
  6. 【转载】Powershell设置世纪互联Office365嵌套组发送权限
  7. JSON简介以及用法代码汇总
  8. Visual Studio 调试技巧 (二)-- 为中断设置条件
  9. LIBSVM之一
  10. FPGA的SPI从机模块实现
  11. 精通CSS+DIV基础总结(一)
  12. MySQL-python 1.2.3 for Windows and Python 2.7, 32bit and 64bit versions -(亲测可用)
  13. HDU 4790 Just Random 数学
  14. 面试题-Java Web-网络通信
  15. Python学习笔记1:数据模型和特殊方法(魔术方法)
  16. quartz 定时任务
  17. Maven使用中央仓库下载慢的解决办法
  18. Node入门教程(2)第一章:NodeJS 概述
  19. IOS开发之尺寸
  20. Android 屏幕适配插件 ScreenMatch

热门文章

  1. Android学习笔记之mainfest文件中android属性
  2. spring拦截器Interceptor
  3. python 布尔值索引
  4. ThInkPHP加密和解密cookie(登录操作)
  5. ubuntu上安装notepadpp
  6. Linux之rpm包管理-yum在线管理
  7. 廖雪峰Python总结2
  8. 日期格式之——new Date()的用法
  9. 【转】MySQL的btree索引和hash索引的区别
  10. 【JZOJ4772】【NOIP2016提高A组模拟9.9】运输妹子