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  __getattr__与__setattr__使用方法
Sep 06 Python
更改Python命令行交互提示符的方法
Jan 14 Python
编写Python脚本来获取Google搜索结果的示例
May 04 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
python批量图片处理简单示例
Aug 06 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
Python如何读取文件中图片格式
Jan 13 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 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 数学运算验证码实现代码
2009/10/11 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
代码分析Python地图坐标转换
2018/02/08 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python同时遍历两个list用法说明
2020/05/02 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
教师节座谈会主持词
2015/07/03 职场文书
户外拓展训练感想
2015/08/07 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技