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中的yield浅析
Jun 16 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
Python图像处理之识别图像中的文字(实例讲解)
May 10 Python
python中文编码与json中文输出问题详解
Aug 24 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
ipython和python区别详解
Jun 26 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 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
Yii多表联合查询操作详解
2016/06/02 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
pytorch进行上采样的种类实例
2020/02/18 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
客服部工作职责范本
2014/02/14 职场文书
中等生评语大全
2014/05/04 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
新年晚会开场白
2015/05/29 职场文书
会议简讯范文
2015/07/20 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python