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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
python中as用法实例分析
Apr 30 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python装饰器用法实例总结
Feb 07 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
Python中collections模块的基本使用教程
Dec 07 Python
在Pycharm中执行scrapy命令的方法
Jan 16 Python
python异步编程 使用yield from过程解析
Sep 25 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
对Keras自带Loss Function的深入研究
May 25 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
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
php简单统计在线人数的方法
2016/05/10 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
管理专员自荐信
2014/01/26 职场文书
食品安全检查制度
2014/02/03 职场文书
网络营销策划方案
2014/06/04 职场文书
联片教研活动总结
2014/07/01 职场文书
中小学生学籍证明
2014/10/25 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
nginx实现动静分离的方法示例
2021/11/07 Servers
DIY胆机必读:各国电子管评价
2022/04/06 无线电