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 相关文章推荐
解决Spyder中图片显示太小的问题
Apr 27 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
浅析Python装饰器以及装饰器模式
May 28 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
python可视化实现代码
Jan 15 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
python实现二分查找算法
Sep 18 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
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
php时间函数用法分析
2016/05/28 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
python实现聚类算法原理
2018/02/12 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
python__name__原理及用法详解
2019/11/02 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
群众路线教育党课主持词
2014/04/01 职场文书
创意婚礼策划方案
2014/05/18 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
志愿者个人总结
2015/03/03 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
广播体操比赛主持词
2015/06/29 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书