基本处理

之前提到的请求上下文中的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验证函数:

验证函数 说 明
Email 验证电子邮件地址
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'>&times;</button> <!--&times是×-->{{ message }}</div>{% endfor %}{% block page_content %}{% endblock %}
</div>
{% endblock %}    

输入两次不同后如下:

在之前的请求循环中每次调用flash()函数都会生成一个消息,会形式多个消息排队等待的情况,所以用for;get_flashed_messages()获取的消息在下次调用时不会再次返回,所以Flash消息只显示一次

2.用Flask-WTF处理表单相关推荐

  1. 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 ...

  2. Flask使用Flask-WTF表单

    Flask-WTF Flask-WTF是Flask框架的表单验证模块,Flask-WTF将表单数据解析.CSRF保护.文件上传等功能与Flask集成. 安装 Flask-WTF及其依赖可使用pip安装 ...

  3. Flask之Web表单使用

    Web表单使用 @(Flask) request对象包含客户端发出的所有请求信息. request.form能获取POST请求中提交的表单数据. 使用的包 Flask-WTF可以把处理Web表单的过程 ...

  4. Flask中的表单处理以及邮件发送

    flask中集成的web表单处理 为什么使用Flask-WTF? request对象公开了所有客户端发送的请求信息.特别是request.form可以访问POST请求提交的表单数据. 尽管Flask的 ...

  5. python flask 表单提交_python中flask应用(表单处理)

    本篇文章给大家带来的内容是关于python中flask应用(表单处理),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.为什么使用Flask-WTF? request对象公开了所有 ...

  6. flask入门之表单提交

    1. 介绍 Flask是基于python的web框架,核心部分包括Werkzeug和jinja2. 本节模拟一个表单提交的过程,即在用户提交表单后浏览到新页面.需要准备两个html文件(一个提交界面和 ...

  7. Web框架——Flask系列之WTF表单验证练习(七)

    一.Web表单 web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将 ...

  8. Flask入门 表单Flask-wtf form原生与Bootstrap渲染(七)

    (1) 原生的表单 模板页面,form表单form.html <form action="{{ url_for('/check/') }}" method='post'> ...

  9. python实现:Flask_WTF表单

    Web表单 web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户 ...

  10. form表单获取多选的值

    flask 中 form 表单直接获取多选框的值时 language = request.values.getlist('values')或 language=request.from.getlist ...

最新文章

  1. linux c 通过 pid 获取 进程相关信息 cmdline
  2. hive 解密_hive 中自定义 base64 加密 解密 UDF 函数
  3. BZOJ3775 : 点和直线
  4. 一个老外如何丑化中国程序员
  5. PyQt5 快速开发 与 实战
  6. python中quad_python – 沿quadmesh的x轴的日期
  7. WPF TextBox/TextBlock 文本超出显示时,文本靠右显示
  8. 如何删减QQ无用功能 为系统彻底减负
  9. android客户端功能,人人网Android版手机客户端功能详解
  10. c语言结构体简单试题,C语言6结构体练习题6
  11. 电脑文件备份到移动硬盘的方法
  12. JAVA—— MySQL高级(二)
  13. KF、EKF、ESKF的区别与联系
  14. 百度财报解析-百度云要变成老大哥
  15. jQuery+PHP实现微信大转盘抽奖 v1.0
  16. OpenTsdb官方文档----查询过滤器
  17. 第30节 程序中的三国天下
  18. 用计算机求锐角三角形的度数,三角函数超入门(2)锐角三角形的三角比
  19. U-Net网络结构详解
  20. 什么是SCCP认证?POPS测试是什么?POPS-SCCP如何测试

热门文章

  1. 【2020年领域新星】 刘大一恒 华为
  2. SYSTEMTIME、FILEITIME、LOCLTIME、UTC、QDateTime等各种时间
  3. 长得漂亮的女人比有才华的女人更吃香吗?
  4. 手机屏幕坏了,不能进入开发者模式,不能导相片、通讯录、短信等
  5. 后端文件上传逻辑详解
  6. NewStarCTF 公开赛赛道 第一周Web题目
  7. 猎聘网简历优化收费服务怎么样?
  8. 以web api为基础开发的ai码平台
  9. 国产品牌EMMC(32G-64G)商规级
  10. aspx 文件上传(简单)