1. Flask-WTF 的安装与密钥的设置

默认情况下,flask-wtf 能保护所有表单免受跨站请求伪造(Cross-site Request Forgery,CSRF)的攻击。恶意网站把请求发送到攻击者已登陆的其他网站时就会引发 CSRF 攻击。

flask-wtf 的安装如下:

pip install flask-wtf

为了实现 CSRF 保护,Flask-WTF 需要程序设置一个密钥,Flask-WTF 使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。

设置密钥的方法如下所示:

app.config['SECRET_KEY'] = 'hard to guess'

app.config 字典可用来存储框架、扩展和程序本身的配置变量。

2. 表单类

使用 flask-wtf 时,每个 Web 表单都由一个继承自 Form 的类表示。该类用于定义表单中的一组字段,每个字段都用对象表示。字段对象可附属一个或多个验证函数。验证函数用来验证用户提交的输入值是否符合要求。

from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequiredclass NameForm(Form):name = StringFiled('What is your name?', validators=[DataRequired()])submit = SubmitField('submit')
  • StringFiled 类表示属性为 type=”text” 的 <input> 元素。
  • SubmitField 类表示属性为 type=”submit” 的 <input> 元素。
  • DataRequired()确保提交的字段不为空。

3. 把表单渲染成 HTML

tempaltes/base.html

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %} Flasky {% endblock %}
{% block page_content %}
<div class="page-header"><h1>Hello, {% if name %}{{ name }} {% else %} Stranger {% endif %}</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

4. 在视图函数中处理表单

@app.route('/', methods=['GET', 'POST'])
def index():name = Noneform = NameForm()if form.validate_on_submit():name = form.name.dataform.name.data = ''return render_template('index.html', name=name, form=form)

5. 重定向和用户会话

这里还存在一个可用性问题,就是用户输入名字后提交表单,然后点击浏览器的刷新按钮,会看到一个警告,要求在再次提交表单之前进行确认。之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求。如果这个请求是一个包含表单数据的 POST 请求,刷新页面后会再次提交表单。当然,大部分情况下,这并非是最理想的处理方式。

基于此,最好不让 POST 作为浏览器发送的最后一个请求。

该需求的实现方式为,使用重定向作为 POST 请求的响应,而不是常规响应,重定向是一种特殊的响应,响应内容是 URL,而不是包含 HTML 代码的字符串。浏览器收到这种响应时,会向重定向的 URL 发起 GET 请求,显示页面内容,这个页面的加载可能要花几微妙,因为要先把第二个请求发送给服务器。除此之外,对用户透明(用户不会觉察有什么不同)。如此,便实现了最后一个请求是 GET 请求,所以刷新命令能像预期的那样正常使用了。该技术称为 POST/ 重定向 GET/模式

@app.route('/', methods=['GET', 'POST'])
def index():form = NameForm()if form.validate_on_submit():session['name'] = form.name.datareturn redirect(url_for('index'))return render_template('index.html', name=session.get('name'), form=form)

6. flash 消息

@app.route('/', methods=['GET', 'POST'])
def index():form = NameForm()if form.validate_on_submit():old_name = session.get('name')if old_name is not None and old_name != form.name.data:flash('look like you have changed your name!')session['name'] = form.name.datareturn redirect(url_for('index'))return render_template('index.html', name=session.get('name'), form=form)

仅调用 flash() 函数并不能把消息显示出来,程序使用的模板要渲染这些消息。最好在基模板(templates/base.html)中渲染 flash 消息。这样所有页面均可使用这些消息。

{% block content %}
<div class="container">{% for message in get_flash_messages() %}<div classs="alert alert-warning"><button type="button" class="close" data_dismiss="alert">&times;</button>{{message}}</div>{% endfor %}{% block page_content %}{% endblock %}
</div>{% endblock %}

Python Flask Web 第十课 —— flask-wtf相关推荐

  1. Python Flask Web教程001:Flask 简介

    Flask Web教程001:Flask 简介 0. 前言 1. flask简介 2. flask的优势 3. 总结 0. 前言 本系列教程从Flask框架的基础知识开始,逐渐深入到使用flask进行 ...

  2. Python Flask Web教程002:Flask 快速上手

    Flask Web教程002:Flask 快速上手 0. 前言 1. Web基础知识 2. 第一个flask web程序 3. 总结 0. 前言 web开发中有一些共同的功能,比如:数据库驱动.网页模 ...

  3. Python界面编程第二十课:Pyside2 (Qt For Python)文本编辑框QTextEdit

    先看完整代码: from PySide2.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit import sys from ...

  4. Python Flask Web教程014:Flask 消息闪现

    Flask 消息闪现 一个好的基于 GUI 的应用程序会向用户提供有关交互的反馈.例如,桌面应用程序使用对话框或消息框,JavaScript 使用警报用于类似目的. 在 Flask Web 应用程序中 ...

  5. Python界面编程第十课:Pyside2 (Qt For Python)创建StatusBar

    QStatusBar 是什么?  QStatusBar类提供了一个适合于显示状态信息的横向条幅. 状态指示分为三类: Temporary – 一般地占据了大部分的状态栏.用于解释控件提示文本或菜单项. ...

  6. Python Flask Web 第六课 —— 静态文件

    1. 静态文件与 web 程序的组成 Web 程序不是仅由 Python 代码 模板组成, 静态文件, HTML 代码中引用的图片. JavaScript 源码文件. CSS: >>> ...

  7. Python Flask Web 第十一课 —— 使用 Flask-SQLAlchemy 管理数据库

    alchemy:炼金术,魔力: flask-sqlalchemy 是一个 flask 扩展,其简化了在 Flask 程序中使用 SQLAlchemy 的操作.SQLAlchemy 是一个很强大的关系型 ...

  8. Python Flask Web 第八课 —— request 请求对象

    from flask import request 请求对象包含客户端发出的所有请求信息. 1. request.headers request.headers.get('User-Agent') 获 ...

  9. Python Flask Web 第七课 —— 使用 flask-moment 本地化日期和时间

    服务器需要统一时间单位,这与用户所在的地理位置(时区)无关,所以一般使用协调世界时(UTC,Coordinated Universal Time). 对用户而言,会对 UTC 格式的时间感到困惑,更希 ...

最新文章

  1. 设计模式 之美 --- 初篇
  2. [翻译] NumSharp的数组切片功能 [:]
  3. 价值5000的三网免挂码支付系统
  4. 福布斯中国2020科技女性榜:蓝港互动廖明香、百度李莹等上榜
  5. Android 基本控件使用
  6. java工程窗口程序_java工程开发之图形化界面之(第二课)
  7. 公募FOF同质化产品情况引人关注
  8. 一线实践 | 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统
  9. 程序设计方法和程序分析
  10. 速锐得车载以太网的信息性能优势硬件及应用研究
  11. 后基因组行为遗传学:从革命到常规(上)
  12. 用c语言编译频率求波长,频率与波长的换算公式(c=λv)
  13. matlab 无刷电机,无刷直流电机的matlab仿真
  14. 单模光纤和多模光纤的对比
  15. 04、Hadoop框架HDFS NN、SNN、DN工作原理
  16. 大数据知识面试题-Flink(2022版)
  17. 一种网格去噪算法(基于平均面法向的均值滤波)
  18. 通过javascript获取sharepoint数据,使用JS导出Excel
  19. Hadoop源代码分析
  20. 用matlab如何拟合曲线,用MATLAB怎么实现曲线拟合?

热门文章

  1. android ems的作用,对话框主题活动中忽略android:minEms
  2. ubuntu无法设置亮度,触摸板失效,声音无法调节
  3. xmapp mysql打不开_XAMPP 的MYSQL无法启动
  4. linux定义数据结构压缩,Linux下数据结构学习笔记
  5. 剑指offer面试题50. 第一个只出现一次的字符(哈希表)
  6. Numpy——numpy的索引
  7. 最大公约数之辗转相除法
  8. sift算法的主要步骤
  9. 20面向对象三特征 之继承 方法重写 super
  10. 49.把字符串转换成整数