Flask系列09--Flask中WTForms插件,及自定义验证器
一.概述
django中的forms组件非常的方便,在flask中有WTForms的组件实现的也是类似的功能, 安装这个插件

二.简单使用
文档地址https://wtforms.readthedocs.io/en/latest/
简单写一个注册的form
# 注册表单
class RegForm(Form):
username = simple.StringField(
label='用户名',
validators=[validators.DataRequired(message='用户名不能为空')] ) password = simple.PasswordField(
label='密码',
validators=[
validators.DataRequired(message='密码不能为空'),
validators.Length(min=1, max=10, message='密码长度不正确'),
]
) re_password = simple.PasswordField(
label='确认密码',
validators=[
validators.EqualTo('password', message='密码不一致')
]
) email = simple.StringField(
label='邮箱',
validators=[
validators.Email(message='邮箱格式不正确')
]
) hobby = core.SelectMultipleField(
label='爱好',
choices=[
(1, '足球'),
(2, '篮球'),
(3, '网球'),
], default=[1, 3], # 设置默认值,
coerce=int ) gender = core.SelectField(
label='性别',
choices=[
(1, '男'),
(2, '女')
],
default=,
coerce=int
) sub = simple.SubmitField(
label='提交',
render_kw={'style': "color: red"},
)
这里写了sub按钮,在前端文件中如果不想让标签显示出来比如
前端页面可以这样写
<form action="" method="post" novalidate>
{% for field in form_obj %}
{% if field.type == "SubmitField" %}
<p>{{ field }}{{ field.errors.0 }}</p>
{% else %}
<p>{{ field.label }}{{ field }}{{ field.errors.0 }}</p>
{% endif %}
{% endfor %}
</form>
结果预览:

三 . 自定义验证器 validator
有两种写法,一种是类的,另外一种是写成函数
1.函数
class SignupForm(Form):
age = IntegerField(u'Age')
def validate_age(form, field):
if field.data < 13:
raise ValidationError("We're sorry, you must be 13 or older to register")
2. 类
# 自定义验证器,类 的写法
class pwd_validator():
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
pwd = field.data
if pwd != '':
raise ValidationError(self.message)
示例 登陆:
# 自定义验证器,类 的写法
class pwd_validator():
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
pwd = field.data
if pwd != '':
raise ValidationError(self.message) class LoginForm(Form):
username = simple.StringField(
label='用户名',
validators=[validators.DataRequired(message='用户名不能为空'), ]
)
# 自定义验证器, 函数的写法
def validate_username(form, field):
if field.data != 'tom':
raise ValidationError('用户名错误')
password = simple.PasswordField(
label='密码',
validators=[
validators.DataRequired(message='密码不能为空'),
validators.Length(min=1, max=10, message='密码长度不正确'),
pwd_validator('密码必须是123'), ]
)
sub = simple.SubmitField(
label='登陆',
render_kw={'class': 'red'}
)
cbv中运用
class Login(views.MethodView):
def get(self):
form_obj = LoginForm()
return render_template("login.html", form_obj=form_obj)
def post(self):
dic = request.form.to_dict()
username = dic.get('username')
password = dic.get('password')
# if username == 'tom' and password == '123':
login_data = LoginForm(request.form)
if login_data.validate():
# print(login_data.data)
session['user'] = dic['username']
s = session.get('user')
return '登陆成功 session是{}'.format(s)
else: return render_template('login.html', form_obj=login_data)

Flask系列09--Flask中WTForms插件,及自定义验证器的更多相关文章
- flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证
flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 u ...
- flask 自定义验证器(行内验证器、全局验证器)
自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...
- Flask系列(二)Flask基础
知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...
- Flask系列(六)Flask实例化补充及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...
- 在pixi中使用你的自定义着色器
通过几天的学习,对openGL.shader有了一个大致的了解. 回到学习的初衷吧,在基于pixi.js重构D3项目的时候,因为精灵层级的问题,我得按照一定的先后顺序将不同类别的精灵添加到场景中去. ...
- Flask系列之蓝图中使用动态URL前缀
让我们先来看一个简单的例子,假设有下面这样一个蓝图(是关于用户主页的): from flask import Blueprint, render_template profile = Blueprin ...
- Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...
- Flask系列(四)Flask实现简单页面登陆
from flask import Flask,render_template,request,redirect,session app = Flask(__name__,template_folde ...
- Flask系列(五)Flask实现分页
一.flask分页组件 from urllib.parse import urlencode,quote,unquote class Pagination(object): ""& ...
随机推荐
- libmysqlclient version
You probably know that the version number of the libmysqlclient.so library has changed from .16 to . ...
- oracle 查看表空间使用情况
查看表空间剩余: ||'M' from dba_free_space group by tablespace_name 查看表空间总大小.使用大小.剩余大小,使用率.剩余率 ) useded, tru ...
- HMM(隐马尔可夫模型)不断学习中
HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,举一个经典的例子:一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到 ...
- 3-具体学习git--reset回到过去的版本(commit间穿梭),checkout单个文件穿梭
git log --oneline 命令可以在一块儿显示做过的改动. 我在change 2时忘了一条,想在change 1后再添加一个语句或一个操作,然后这个状态再提交仍作为change 2.将这个s ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- Beta阶段第三篇Scrum冲刺博客-Day2
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:熟悉代码 郭琪容:了解复习模块需要的部分知识 ...
- hdu 5094 状压bfs+深坑
http://acm.hdu.edu.cn/showproblem.php?pid=5094 给出n*m矩阵 给出k个障碍,两坐标之间存在墙或门,门最多10种,状压可搞 给出s个钥匙位置及编号,相应的 ...
- ubuntu apache linux
在ubuntu下安装的apache, 很多配置文件都分开写了,需要了解一下各部分: http://blog.csdn.net/veizz/article/details/7410784 Ubuntu下 ...
- HDU 3078 LCA转RMQ
题意: n个点 m个询问 下面n个数字表示点权值 n-1行给定一棵树 m个询问 k u v k为0时把u点权值改为v 或者问 u-v的路径上 第k大的数 思路: LCA转RMQ求出 LCA(u,v) ...
- 对java高级程序员有益的十本书
英文原文:http://www.programcreek.com/2013/08/top-books-for-advanced-level-java-developers/ java语言是当今最受欢迎 ...