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中的yield使用方法
Feb 11 Python
python打开文件并获取文件相关属性的方法
Apr 23 Python
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
scrapy爬虫实例分享
Dec 28 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
Python转换时间的图文方法
Jul 01 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
Python xlrd excel文件操作代码实例
Mar 10 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
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
JavaScript中Array方法你该知道的正确打开方法
2018/09/11 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
对pandas处理json数据的方法详解
2019/02/08 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
django实现后台显示媒体文件
2020/04/07 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
上海方立数码笔试题
2013/10/18 面试题
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
情人节寄语大全
2014/04/11 职场文书
质量月活动总结
2014/08/26 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
校本课程教学计划
2015/01/19 职场文书
公司表扬稿范文
2015/05/05 职场文书
七一活动主持词
2015/06/29 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers