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调用windows api锁定计算机示例
Apr 17 Python
在Django的视图中使用数据库查询的方法
Jul 16 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
Python多线程多进程实例对比解析
Mar 12 Python
Keras自定义IOU方式
Jun 10 Python
pandas apply多线程实现代码
Aug 17 Python
Python实现七个基本算法的实例代码
Oct 08 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 memcache扩展的三种安装方法
2009/04/26 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
PHP daddslashes 使用方法介绍
2012/10/26 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
js实现图片上传即时显示效果
2019/09/30 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
python 弧度与角度互转实例
2020/04/15 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
采购员的工作职责
2013/12/26 职场文书
运动会广播稿200米
2014/01/27 职场文书
法律系毕业生求职信
2014/05/28 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
民政局个人整改措施
2014/09/24 职场文书
工作试用期自我评价
2015/03/10 职场文书
地球上的星星观后感
2015/06/02 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers