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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python计算对角线有理函数插值的方法
May 07 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
python write无法写入文件的解决方法
Jan 23 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
用vue.js组件模拟v-model指令实例方法
Jul 05 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
如何利用python和DOS获取wifi密码
Mar 31 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 开发工具
2006/12/06 PHP
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Python配置文件处理的方法教程
2019/08/29 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
python在地图上画比例的实例详解
2020/11/13 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
甲午风云观后感
2015/06/02 职场文书
python 网络编程要点总结
2021/06/18 Python
PHP中多字节字符串操作实例详解
2021/08/23 PHP