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 相关文章推荐
用map函数来完成Python并行任务的简单示例
Apr 02 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
python3音乐播放器简单实现代码
Apr 20 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
在python中pandas的series合并方法
Nov 12 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
Python实战之制作天气查询软件
May 14 Python
python计算n的阶乘的方法代码
Oct 25 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 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中文字母数字验证码实现代码
2008/04/25 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
header跳转和include包含问题详解
2012/09/08 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
django+mysql的使用示例
2018/11/23 Python
python多线程实现TCP服务端
2019/09/03 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
pygame实现非图片按钮效果
2019/10/29 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
成人大专生实习期的自我评价
2013/10/02 职场文书
大学毕业登记表自我鉴定
2013/10/09 职场文书
师范生实习自我鉴定
2013/11/01 职场文书
行政主管职责范本
2014/03/07 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
Golang实现可重入锁的示例代码
2022/05/25 Golang