WTForms表单验证基本使用

Flask-WTF是简化了WTForms操作的一个第三方库。WTForm表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。当然还包括一些其他的功能:CSRF保护,文件上传等。安装Flask-WTF默认也会安装WTForms,因此使用以下命令来安装Flask-WTF:

pip install flask-wtf

因为flask-wtf是对wtforms的一个封装,其原理还是使用wtforms,所以,我们先来学习wtforms怎么使用。

表单验证:我们会遇到如下场景:

  注册的时候判断用户输入的信息是否合法,下面我们做个简单的demon

    <form action="" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password_1" /></td>
</tr>
<tr>
<td>重复密码:</td>
<td><input type="password" name="password_2" /></td>
</tr>
<tr>
<td><input type="submit" value="立即注册" /></td>
<td>
{% if error %}
<p style="color: red">{{ error }}</p>
{% endif %}
</td>
</tr>
</table>
</form>

register

...
from flask import request, render_template @app.route('/register/', methods=['GET', 'POST']) #表明该url接受GET和POST两种方法
def register():
if request.method == 'GET':
return render_template('register.html')
else:
username = request.form.get('username')
password_1 = request.form.get('password_1')
password_2 = request.form.get('password_2') if len(username) < 5 or len(username) > 10:
return render_template('register.html', error="用户名长度不正确")
if len(password_1) < 5 or len(password_1) > 10:
return render_template('register.html', error="密码长度不正确")
if password_1 != password_2:
return render_template('register.html', error="密码不一致")
return '注册成功'

主程序my_flask.py

我们使用上面的代码去取验证表单,虽然可以实现需求,但是会显得非常冗长,并且也不能复用。当项目大的时候就尤其明显,不好管理。下面我们就使用WTForms来把它重构

现在我们可以启动Debug断点调试,注册页面故意输入不符合要求的信息提交

断点看到,form验证没有通过,并且在error中报出了错误的原因,password_1、password_2不符合长度要求,并且密码不一致

错误信息,我们可以自己定制

我们再次断点调试,可以看到错误信息已经变成我们自己定制的了

WTForm常用验证器

数据发送过来,经过表单验证,因此需要验证器来进行验证,如下是一些常用的内置验证器

  • Email:验证上传的数据是否是邮箱
  • EqualTo:验证上传的数据是否和另外一个字段相等,常用的就是密码和确认密码是否相等
  • InputRequired:验证上传的数据是否为空,比如验证必填项
  • Length:长度限制,有min和max两个值进行限制
  • NumberRange: 数字的区间,有min和max两个值限制,如果处在和两个数据之间则满足
  • Regexp:自定义正则表达式
  • URL:必须是URL的形式
  • UUID:验证UUID

我们可以创建一个forms.py文件专门用来处理表单验证,这样比较好管理,编辑forms.py

from wtforms import Form, StringField, IntegerField
from wtforms.validators import Email, Length, EqualTo, NumberRange, Regexp, URL, UUID class RegisterForm(Form):
email = StringField(validators=[Email()])
password_1 = StringField(validators=[Length(5,10)])
password_2 = StringField(validators=[EqualTo('password_1')])
age = IntegerField(validators=[NumberRange(min=18, max=110)])
phone = StringField(validators=[Regexp(r'1[3458]\d{9}')])
blog = StringField(validators=[URL()])
uuid = StringField(validators=[UUID()])

自定义验证器

DEBUG调试

15、Flask实战第15天:Flask-WTF的更多相关文章

  1. Flask实战-留言板-安装虚拟环境、使用包组织代码

    Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...

  2. 1、Flask实战第1天:第一个Flask程序

    Flask是流行的python web框架...(* ̄︶ ̄) 零基础到企业级论坛实战,人生苦短,我用python,开启FLask之旅吧... 安装开发环境 下载Python win版安装包 双击运行, ...

  3. flask tutorial => make a blog :) flask 搭建博客系统从零开始!

    please follow the tutorial from the official site :) http://flask.pocoo.org/docs/ You could download ...

  4. 【Flask】微型web框架flask大概介绍

    Flask Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持 ...

  5. Flask从入门到精通之flask安装

    使用虚拟环境 安装Flask最简单的方式是使用虚拟环境,虚拟环境是python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装的全局的Python解释器.虚拟环境非常有用,可 ...

  6. Flask - 特殊装饰器 和 Flask工作结构模式(FBV, CBV)

    目录 Flask - 特殊装饰器 和 Flask工作结构模式 @app.errorhandler() @app.before_request @app.after_request FBV和CBV Fl ...

  7. Flask框架(一)—— Flask简介

    Flask框架(一)—— Flask简介 目录 Flask框架介绍 一.Flask简介 二.flask安装与使用 1.安装 2.使用 3.简单案例——flask实现用户登录 Flask框架介绍 一.F ...

  8. 08 Flask源码剖析之flask拓展点

    08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...

  9. 02 flask源码剖析之flask快速使用

    02 flask快速使用 目录 02 flask快速使用 1.flask与django的区别 2. 安装 3. 依赖wsgi Werkzeug 4. 快速使用flask 5. 用户登录&用户管 ...

随机推荐

  1. 【题解】HAOI2008木棍分割

    对于这道题目的两问,第一问直接二分答案求出最短长度.关键在于第二问应当如何求:建立dp方程,dp[i][j]代表到第i个分界线,切了j次(强制在第i处切一刀.这样就不会对后面的状态产生影响).状态转移 ...

  2. python实现关联规则

    代码中Ci表示候选频繁i项集,Li表示符合条件的频繁i项集 # coding=utf-8 def createC1(dataSet): # 构建所有1项候选项集的集合 C1 = [] for tran ...

  3. poj3347 Kadj Squares (计算几何)

    D - Kadj Squares Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

  4. input 单选按钮radio 取消选中(转载)

    input单选按钮: 在radio按钮中添加属性tag  0代表未被选中 HTML代码: <input name="rdo1" value="AA" ty ...

  5. struts2学习笔记(二)

    一. 国际化的目标 1). 如何配置国际化资源文件 I. Action 范围资源文件: 在Action类文件所在的路径建立名为 ActionName_language_country.properti ...

  6. MVC前台获取ViewData的数组中的值

    查了一上午资料,找到了一种比较有效的方法 后台控制器:public ActionResult Index() { List<string> colors = new List<str ...

  7. 如何去掉Json字符串中反斜杠

    做项目的时候,遇到了这样的问题,前台传来的Json字符串在实体类中不对应(无法转换为实体类),而且传来的数据项是跟着数据库中的表的变动而变动的(不能重写实体类). 前台Json字符串为: string ...

  8. 【LA3487】最小割-经典模型 两种方法

    题目链接 题意:A.B两个公司要买一些资源(他们自己买的资源不会重复),一个资源只能卖给一个公司.问最大收益. simple input 部分: 54 1 //买到1就给54元 15 2 33 3 2 ...

  9. WC后记

    这次去WC本来就是抱着玩儿玩儿的心态去的,结果真算是玩儿了... 我们去的内天北京正好下雪,结果后来等我舅接我们去八十中的时候还在外面等了半个小时,其实雪天在外面挺好的,除了旁边都是一些男程序员.后来 ...

  10. bzoj 3223 裸splay

    裸的splay 今儿写的splay,由于自己刚开始学,发现几个容易漏掉的地方 1:开始给所有的儿子赋值为-1 2:给max[-1]赋值为-maxlongint 3:开始father[root]:=sr ...