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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
详解Django缓存处理中Vary头部的使用
Jul 24 Python
判断网页编码的方法python版
Aug 12 Python
Python3计算三角形的面积代码
Dec 18 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
python 定时修改数据库的示例代码
Apr 08 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
python中count函数知识点浅析
Dec 17 Python
Python Django ORM连表正反操作技巧
Jun 13 Python
对象析构函数__del__在Python中何时使用
Mar 22 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/10/09 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
python重试装饰器示例
2014/02/11 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
浅谈CSS3 box-sizing 属性 有趣的盒模型
2019/04/02 HTML / CSS
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
乐观大学生的自我评价
2014/01/10 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
交心谈心活动总结
2015/05/11 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书