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): ""& ...
随机推荐
- 20155312 2016-2017-2 《Java程序设计》第五周学习总结
20155312 2016-2017-2 <Java程序设计>第五周学习总结 课堂笔记 十个基本类型 命令:ascii打印ascii值, od -tx1 Test.java用十六进制查看代 ...
- 单片机一种简便的printf调试方案。
此处引用csdn博客.链接如下. http://blog.csdn.net/cp1300/article/details/7773239 http://blog.csdn.net/aobai219/a ...
- 关于xp操作系统下使用VC6++编写的上位机软件在win10中运行的问题
将代码拷贝到win10操作系统中,在vs2015环境中重新编译即可. 编译生成的exe出现终止时考虑mscomm控件是否注册. 当win10环境64位操作系统时,将以下四个文件放置于C:\Window ...
- 再读c++primer plus 005
对象和类: 1.类和结构的唯一区别是结构的默认访问类型是public,而类为private: 2.其定义位于类声明中的函数都将自动成为内联函数,也可以在类声明外定义成员函数,并使其成为内联函数,为此只 ...
- java web 大总结
C/s架构: socket.serversocket.awt/swing做一个客户端软件 建好socket连接后,通过IO流交换数据.数据格式由各个开发者自己确定,B/C架 ...
- 840. Magic Squares In Grid
class Solution { public: int numMagicSquaresInside(vector<vector<int>>& grid) { ; in ...
- 关于流量升高导致TIME_WAIT增加,MySQL连接大量失败的问题
有个应用就是每次都会去查一个接口,接口返回用户的信息数据,从而展现不同的页面效果.大致流程如下 应用APP(电信)-> memcache ->电信custom接口 ->master- ...
- 2019.01.24 bzoj3125: CITY(轮廓线dp)
传送门 题意简述:给一个n∗mn*mn∗m的网格图,有的格子不能走,有的格子只能竖着走,有的格子只能横着走,问用一条回路覆盖所有能走的格子的方案数. 思路: 就是简单的轮廓线dpdpdp加了一点限制而 ...
- 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)
传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...
- s7-200 PID控位
只有加热模块,没有风扇,所以温度上冲达到5度左右 TITLE=程序注释 Network // 网络标题 // 初始化 LD SM0. LPS MOVW , VW500 MOVW , VW502 MOV ...