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读写Redis数据库操作示例
Mar 18 Python
列举Python中吸引人的一些特性
Apr 09 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
浅谈Python中数据解析
May 05 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
在python plt图表中文字大小调节的方法
Jul 08 Python
python装饰器使用实例详解
Dec 14 Python
Python random库使用方法及异常处理方案
Mar 02 Python
Python学习之os模块及用法
Jun 03 Python
Java byte数组操纵方式代码实例解析
Jul 22 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 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中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
浅析php单例模式
2014/11/25 PHP
php报错502badgateway解决方法
2019/10/11 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
Python实现配置文件备份的方法
2015/07/30 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
合作协议书怎么写
2014/04/18 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
居委会工作总结2015
2015/05/18 职场文书
怒海潜将观后感
2015/06/11 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
python百行代码实现汉服圈图片爬取
2021/11/23 Python