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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
浅谈python对象数据的读写权限
Sep 12 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
python版飞机大战代码分享
Nov 20 Python
Python实现Linux监控的方法
May 16 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
Python使用xpath实现图片爬取
Sep 16 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 和 MySQL 基础教程(二)
2006/10/09 PHP
PHP网站基础优化方法小结
2008/09/29 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
javascript引导程序
2008/10/26 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
跟老齐学Python之类的细节
2014/10/13 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
python如何爬取网页中的文字
2020/07/28 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
linux比较文件内容的命令是什么
2015/09/23 面试题
宿舍使用违章电器检讨书
2014/01/12 职场文书
高一新生军训感言
2014/03/02 职场文书
项目建议书范文
2014/05/12 职场文书
介绍信如何写
2015/01/31 职场文书
会议新闻稿
2015/07/17 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL