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与js)两种实现
Feb 21 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
Python提取频域特征知识点浅析
Mar 04 Python
Python中dict和set的用法讲解
Mar 28 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
基于python实现计算两组数据P值
Jul 10 Python
分享python函数常见关键字
Apr 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
PHP基础知识回顾
2012/08/16 PHP
header跳转和include包含问题详解
2012/09/08 PHP
php中的静态变量的基本用法
2014/03/20 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python之py2exe打包工具详解
2017/06/14 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
python write无法写入文件的解决方法
2019/01/23 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Django中create和save方法的不同
2019/08/13 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
.net开发工程师面试题
2014/02/25 面试题
经营目标管理责任书
2014/07/25 职场文书
大学同学会活动方案
2014/08/20 职场文书
民事赔偿协议书
2014/11/02 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python