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 相关文章推荐
django将图片上传数据库后在前端显式的方法
May 25 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python多图片合并PDF的方法
Jan 03 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
Jan 30 Python
Python字符串对象实现原理详解
Jul 01 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
利用python在excel中画图的实现方法
Mar 17 Python
python字符串判断密码强弱
Mar 18 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
pandas抽取行列数据的几种方法
Dec 13 Python
python中mongodb包操作数据库
Apr 19 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自定义函数返回多个值
2006/11/26 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
使用正则替换变量
2007/05/05 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Mac 上切换Python多版本
2017/06/17 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
pyqt5实现登录界面的模板
2020/05/30 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
婚前协议书怎么写
2014/04/15 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
Python爬虫基础初探selenium
2021/05/31 Python
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python