2.用Flask-WTF处理表单
基本处理
之前提到的请求上下文中的request.form
可以获得POST请求中提交表单数据,一个个去处理显然很繁琐,这时可以用Flask-WTF来让一切变得更加简单,它集成了WTForms,安装如下:
pip install flask-wtf
设置密钥
为了防止恶意网站的CSRF攻击,Flask-WTF用一个密钥生成加密令牌,再用令牌验证数据的真伪,我们把这个密钥放在app.config
字典中,这里面存储了一些框架的配置变量,还支持导入配置值(一般密钥是保存在环境变量里的),代码如下:
# demo.py
...
app = Flask(__name__)
app.config['SECRET_KEY'] = 'some secret string'
...
使用表单类
在这个拓展中每个表单都由一个继承Form
的类,里面的每个字段都定义为类变量,还可以附属验证函数,如下:
from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Requiredclass NameForm(Form):name = StringField('你的名字:', validators=[Required()]) # validator为验证函数组成的列表submit = SubmitField('Go')
WTForms支持的HTML标准字段:
字段类型 | 说 明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatFiled | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True和False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可选择多个值 |
FileField | 文件上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入另一表单 |
FieldList | 一组指定类型的字段 |
WTForms验证函数:
验证函数 | 说 明 |
---|---|
验证电子邮件地址 | |
EqualTo | 比较两个字段的值,常用于要求输入两次密码确认的情况 |
IPAddress | 验证IPv4网络地址 |
Length | 验证输入字符串的长度 |
NumberRange | 验证输入的值在数字范围内 |
Optional | 无输入值时跳过其他验证函数 |
Required | 确保字段中有数据 |
Regexp | 使用正则表达式验证输入值 |
URL | 验证URL |
AngOf | 确保输入值在可选值列表中 |
NoneOf | 确保输入值之不在可选值列表中 |
页面部分:渲染表单
接下来要在页面上显示,我们可以把表单实例通过参数form
传入模板,如下:
<form method="POST">{{ form.hidden_tag() }}{{ form.name.label }} {{ form.name() }}{{ form.submit() }}
</form>
有些麻烦是吧,好在Flask-Bootstrap提供了一个好用的函数quick_form()
,它接收一个表单对象,方便快速的渲染表单:
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %} <!-- 导入模板中的元素并别名为wtf -->{% block title %}首屋{% endblock %}
{% block page_content %}
<div class="page-header"><h1>你来了, {% if name %} {{ name }}{% else %}外乡人{% endif %}!!</h1>
</div>
{{ wtf.quick_form(form) }} <!-- 这里对form对象进行渲染-->
{% endblock %}
运行如图:
后端部分:处理表单
接收到POST请求后要进行处理,由于之前的首页路由只有默认的GET请求方法,我们要添加POST方法,虽然表单也可以用GET提交(以查询字符串形式加到URL中),但它没有主体以及其他安全问题,还是稳稳用POST吧
改写的index路由如下:
@app.route('/', methods=['GET', 'POST']) # methods参数注册请求方法
def index():name = Noneform = NameForm() # 实例化一个表单if form.validate_on_submit(): # 表单成功提交后进入name = form.name.data # 通过字段的data属性获取form.name.data = '' # 获取数据后清空表单return render_template('index.html', form=form, name=name, cur_time=datetime.utcnow(), time=datetime(1995,7,1))
这个过程:第一次GET获取页面和表单,第二次POST提交表单进入if获得参数进行渲染
提交表单后:
用户会话(session)的使用
它是之前提到过的请求上下文中的变量(另一个是request),session以字典的形式存储请求之间的数据,存于客户端的cookie中并用使SECRET_KEY
加密,为什么要用它,需要了解一下重定向
重定向是一种特殊响应,响应内容是URL,浏览器接收到这种响应时会向重定向的URL发起GET请求来显示页面的内容
因为刷新页面时浏览器会重新发送之前发送的最后一个请求,如果是POST(包含表单数据)那刷新后就会再次提交,显然这是不好的,不要把POST请求作为浏览器的最后一个请求,这时可以用重定向来实现,这种避免POST放在最后而用GET的技巧被称作 Post/重定向/Get模式,但当一个请求结束时数据也会跟着丢失,此时session就派上了用场:
from flask import Flask, render_template, redirect, url_for, session # 记得导入所用的
@app.route('/', methods=['GET', 'POST']) # methods参数注册请求方法
def index():form = NameForm() # 实例化一个表单if form.validate_on_submit(): # 判断表单是否成功提交session['name'] = form.name.data # 把值保存在session中return redirect(url_for('index')) # 为了兼容return render_template('index.html', form=form, name=session.get('name'), cur_time=datetime.utcnow(), time=datetime(1995,7,1))
url_for()
用于生成URL,它只有一个参数,即端点名(在这里视图函数名),用这个函数可以防止修改路由后URL不可用的问题;session.get('name')
很灵活,当值未找到时返回None
,因此省去了name=None
提交表单后的请求:
Flash提醒
当请求完成后想有点反馈,告知客户端成功或失败,flask有个flash()
函数就是专门干这事的,先看后端代码:
from flask import flash # 记得导入
@app.route('/', methods=['GET', 'POST']) # methods参数注册请求方法
def index():form = NameForm() if form.validate_on_submit(): oldname = session.get('name') if oldname is not None and oldname != form.name.data: # 提交的名字与之前的名字比较flash("我们不一样")session['name'] = form.name.datareturn redirect(url_for('index'))return render_template('index.html', form=form, name=session.get('name'), cur_time=datetime.utcnow(), time=datetime(1995,7,1))
然后在模板中渲染,Flask把get_flashed_messages()
函数开放给了模板,放在content块中:
{% block content %}
<div class="container">{% for message in get_flashed_messages() %}<div class='alert alert-warning'><button type='button' class='close' data-dismiss='alert'>×</button> <!--×是×-->{{ message }}</div>{% endfor %}{% block page_content %}{% endblock %}
</div>
{% endblock %}
输入两次不同后如下:
在之前的请求循环中每次调用flash()
函数都会生成一个消息,会形式多个消息排队等待的情况,所以用for;get_flashed_messages()
获取的消息在下次调用时不会再次返回,所以Flash消息只显示一次
2.用Flask-WTF处理表单相关推荐
- Flask教程(十)表单处理Flask-WTF
软硬件环境 windows 10 64bit anaconda3 with python 3.7 pycharm 2020.1.2 flask 1.1.2 flask_wtf 0.14.3 简介 we ...
- Flask使用Flask-WTF表单
Flask-WTF Flask-WTF是Flask框架的表单验证模块,Flask-WTF将表单数据解析.CSRF保护.文件上传等功能与Flask集成. 安装 Flask-WTF及其依赖可使用pip安装 ...
- Flask之Web表单使用
Web表单使用 @(Flask) request对象包含客户端发出的所有请求信息. request.form能获取POST请求中提交的表单数据. 使用的包 Flask-WTF可以把处理Web表单的过程 ...
- Flask中的表单处理以及邮件发送
flask中集成的web表单处理 为什么使用Flask-WTF? request对象公开了所有客户端发送的请求信息.特别是request.form可以访问POST请求提交的表单数据. 尽管Flask的 ...
- python flask 表单提交_python中flask应用(表单处理)
本篇文章给大家带来的内容是关于python中flask应用(表单处理),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.为什么使用Flask-WTF? request对象公开了所有 ...
- flask入门之表单提交
1. 介绍 Flask是基于python的web框架,核心部分包括Werkzeug和jinja2. 本节模拟一个表单提交的过程,即在用户提交表单后浏览到新页面.需要准备两个html文件(一个提交界面和 ...
- Web框架——Flask系列之WTF表单验证练习(七)
一.Web表单 web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将 ...
- Flask入门 表单Flask-wtf form原生与Bootstrap渲染(七)
(1) 原生的表单 模板页面,form表单form.html <form action="{{ url_for('/check/') }}" method='post'> ...
- python实现:Flask_WTF表单
Web表单 web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户 ...
- form表单获取多选的值
flask 中 form 表单直接获取多选框的值时 language = request.values.getlist('values')或 language=request.from.getlist ...
最新文章
- linux c 通过 pid 获取 进程相关信息 cmdline
- hive 解密_hive 中自定义 base64 加密 解密 UDF 函数
- BZOJ3775 : 点和直线
- 一个老外如何丑化中国程序员
- PyQt5 快速开发 与 实战
- python中quad_python – 沿quadmesh的x轴的日期
- WPF TextBox/TextBlock 文本超出显示时,文本靠右显示
- 如何删减QQ无用功能 为系统彻底减负
- android客户端功能,人人网Android版手机客户端功能详解
- c语言结构体简单试题,C语言6结构体练习题6
- 电脑文件备份到移动硬盘的方法
- JAVA—— MySQL高级(二)
- KF、EKF、ESKF的区别与联系
- 百度财报解析-百度云要变成老大哥
- jQuery+PHP实现微信大转盘抽奖 v1.0
- OpenTsdb官方文档----查询过滤器
- 第30节 程序中的三国天下
- 用计算机求锐角三角形的度数,三角函数超入门(2)锐角三角形的三角比
- U-Net网络结构详解
- 什么是SCCP认证?POPS测试是什么?POPS-SCCP如何测试