Python Flask-web表单使用详解


Posted in Python onNovember 18, 2017

Flask-WTF扩展可以把处理web表单的过程变成一种愉悦的体验。

Python Flask-web表单使用详解

一、跨站请求伪造保护

默认情况下,Flask-WTF能够保护所有表单免受跨站请求伪造的攻击。恶意网站把请求发送到被攻击者已登录的网站时就会引起CSRF攻击。

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

app = Flask(__name__)
app.config['SECRET_KEY']='hard to guess string'

二、表单类

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

#!/usr/bin/env python
#简单的web表单,包含一个文本字段和一个提交按钮
 
from flask_wtf import Form
from wtforms import StringField,SubmitField
from wtforms.validators import Required
 
class NameForm(Form):
  name = StringField('What is your name?',validators=[Required()])
  submit = SubmitField('Submit')

StringField类表示属性为type="text"的<input>元素,SubmitField类表示属性为type="submit"的<input>元素。

WTForms支持的HTML标准字段

Python Flask-web表单使用详解

WTForms验证函数

Python Flask-web表单使用详解

四、把表单渲染成HTML

表单字段是可用的,在模板中调用后会渲染成HTML。假设视图函数把一个NameForm实例通过参数form传入模板,在模板中可以生成一个简单的表单,如下所示:

<form method="POST">
  {{ form.hidden_tag() }}
  {{ form.name.label }} {{ form.name() }}
  {{ form.submit() }}
</form>
<form method="POST">
  {{ form.hidden_tag() }}
  {{ form.name.label }} {{ form.name(id='my-text-field') }}
  {{ form.submit() }}
</form>

Flask-Bootstrap提供了一个非常高端的辅助函数,可以使用Bootstrap中预先定义好的表单样式渲染整个Flask-WTF表单,而这些操作只需调用一次即可完成。

{% import "boostrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
#使用Flask-WTF和Flask-Bootstrap渲染表单
 
{% 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 %}

 四、在视图函数中处理表单

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

app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序。如果没指定methods参数,就只把视图函数注册为GET请求的处理程序。

 五、重定向和用户会话

#!/usr/bin/env python
 
from flask import Flask,render_template,session,redirect,url_for
app = Flask(__name__)
 
@app.route('/',methods=['GET','POST'])
def index():
  form = NameForm()
  if form.validate_on_submit():
    session['name'] = form.name.data
    return redirect(url_for('index'))
  return render_template('index.html',form=form,name=session.get('name'))

六、Flash消息

例子:提示用户名或密码错误,弹出窗口

from flask import Flask,render_template,session,redirect,url_for,flash
app = Flask(__name__)
 
@app.route('/',methods=['GET','POST'])
def index():
  form = NameForm()
  if form.validata_on_submit():
    old_name = session.get('name')
    if old_name is not None and old_name != form.name.data:
      flash('Looks like you have changed your name!')
    session['name'] = form.name.data
    return redirect(url_for('index'))
  return render_template('index.html',form=form,name=session.get('name'))
#渲染Flash消息
 
{% 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 %}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
python验证码图片处理(二值化)
Nov 01 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 #Python
深入理解Python单元测试unittest的使用示例
Nov 18 #Python
Python及PyCharm下载与安装教程
Nov 18 #Python
Python实现读取json文件到excel表
Nov 18 #Python
浅谈python 线程池threadpool之实现
Nov 17 #Python
python线程池(threadpool)模块使用笔记详解
Nov 17 #Python
python交互式图形编程实例(三)
Nov 17 #Python
You might like
漂亮但不安全的CTB
2006/10/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
Vue异步加载about组件
2017/10/31 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
2014大学生全国两会学习心得体会
2014/03/13 职场文书
远程培训的心得体会
2014/09/01 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
防灾减灾标语
2014/10/07 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
关于开学的感想
2015/08/10 职场文书
企业文化学习心得体会
2016/01/21 职场文书
JavaScript原型链详解
2021/11/07 Javascript