客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理web表单的过程变得更简单.

Flask-WTF能保护所有表单免受CSRF的攻击.至于CSRF的原理参考http://www.cnblogs.com/zhanghongfeng/p/7787499.html这个帖子.为了实现CSTF保护,Flask_WTF需要程序设置一个密钥.Flask-WTF用这个密钥生成加密令牌,在用令牌验证请求中表单数据的真伪.设置密钥的方法如下:

import os

app.config['SECRET_KEY']=os.urandom(20)

下面我们来看下表单类.首先来看下完整的代码:

from flask_wtf import Form,FlaskForm

from wtforms import StringField,SubmitField

from wtforms.validators import Required

class NameForm(FlaskForm):

name=StringField('what is your name?',validators=[Required()])

submit=SubmitField('Submit')

@app.route('/',methods=['GET','POST'])

def hello_world():

name=None

form=NameForm()

if form.validate_on_submit():

name=form.name.data

form.name.data=''

return render_template('index1.html',form=form,name=name)

index1的HTML代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>flask test</title>

</head>

<body>

{{ name }}

<form method="POST">

{{ form.hidden_tag() }}

{{ form.name.label }}{{ form.name(id='my-text-field') }}

{{ form.submit() }}

</form>

</body>

</html>

当我们访问http://192.168.0.12:8000/的时候,网页显示如下

当我们在输入框中输入信息则显示出我们输入的信息

接下来我们就来看下代码是如何运行的.首先我们定义了一个表单类,每个表单类都继承自

FlaskForm.这个表单类中包含一个文本字段和一个提交按钮.

WTForms中支持的HTML标准字段如下

字段类型      说  明

StringField 文本字段

TextAreaField 多行文本字段

PasswordField 密码文本字段

HiddenField 隐藏文本字段

DateField 文本字段,值为 datetime.date 格式

DateTimeField 文本字段,值为 datetime.datetime 格式

IntegerField 文本字段,值为整数

DecimalField 文本字段,值为 decimal.Decimal

FloatField 文本字段,值为浮点数

BooleanField 复选框,值为 True 和 False

RadioField 一组单选框

SelectField 下拉列表

SelectMultipleField 下拉列表,可选择多个值

FileField 文件上传字段

SubmitField 表单提交按钮

FormField 把表单作为字段嵌入另一个表单

FieldList 一组指定类型的字段

再来看下视图函数.app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,否则没有methods参数,将只把视图函数注册为GET请求的处理程序.

用户第一次访问程序的时候,服务器会收到一个没有表单数据的GET请求.所以validate_on_submit将返回Flase.通过渲染模板处理请求,用户会看到浏览器中显示一个表单

用户提交表单后,服务器收到一个包含数据的POST请求,valide_on_submit()会调用name字段上附属的Required函数,如果名字不为空,就能通过验证.valide_on_submit返回True.并将名字赋值给局部变量name.最终在页面上被渲染出来

重定向和用户会话

前面的这个表单程序,当我们输入了用户名并且再一次刷新index的页面的时候,之前的信息已经不存在,又回到了表单提交的页面.也就说之前的用户会话没有保存下来,所以刷新后找不到之前的用户.那么要保存用户会话就要用到之前介绍的session会话

代码修改如下:

from flask import Flask,render_template,session,redirect,url_for

@app.route('/',methods=['GET','POST'])

def hello_world():

form=NameForm()

if form.validate_on_submit():

session['name']=form.name.data

return redirect(url_for('hello_world'))

print session.get('name')

return render_template('index1.html',form=form,name=session.get('name'))

首先将name的值赋值给session[‘name’] 然后进行重定向.这里重定向使用的是redirect函数,这里重定向使用的是redirect(url_for('hello_world')).url_for(‘hello_world’)将生成对应的URL也就是’/’.这种使用方式的好处是保证URL和定义的路由兼容.url_for函数的第一个必须指定的参数名是端点名,即路由的内部名字.默认情况下,路由的端点是相应视图函数的名字,比如这里传入的是hello_world函数名

当然也可以简单点通过redirect(‘/’)的方式直接指定URL.

Flask:web表单的更多相关文章

  1. 轻量级Web框架Flask——Web表单

    安装 Flask-WTF及其依赖可使用pip安装 pip install flask_wtf 配置 要求应用配置一个密钥.密钥是一个由随机字符构成的唯一字符串,通过加密或签名以不同的方式提升应用的安全 ...

  2. flask web 表单验证 WTForms

    简介 WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,它在flask-WTF的基础上扩展并添加了一些随手可得的精巧帮助函数,这些函数将会是在flask里使用表单更加 ...

  3. Flask Web Development —— Web表单(上)

    Flask-WTF扩展使得处理web表单能获得更愉快的体验.该扩展是一个封装了与框架无关的WTForms包的Flask集成. Flask-WTF和它的依赖集可以通过pip来安装: (venv) $ p ...

  4. Flask学习 三 web表单

    web表单 pip install flask-wtf 实现csrf保护 app.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程 ...

  5. flask 利用flask_wtf扩展 创建web表单

    在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开 ...

  6. Python——Flask框架——Web表单

    一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...

  7. Flask教程 —— Web表单(上)

    第二章中介绍的request对象公开了所有客户端发送的请求信息.特别是request.form可以访问POST请求提交的表单数据. 尽管Flask的request对象提供的支持足以处理web表单,但依 ...

  8. Flask之模板web表单

    3.3 Web表单: web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过 ...

  9. Flask 教程 第三章:Web表单

    本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你如何使用Web表单. 在第二章中 ...

随机推荐

  1. mongodb培训

    写在前面 公司组织的技术培训,虽然刚接触mongodb没多久,算是入门吧,就组织一次mongodb的入门ppt培训.包括nosql的简单介绍,以及mongodb的一些优缺点,最后包括mongodb的一 ...

  2. java中的堆、栈和常量池简介

    一.它们各自存放的数据类型: 堆:存放所有new出来的对象. 栈:存放基本类型的变量数据和对象的应用,对象(new出来的对象)本身并不存在栈中,而是存放在堆中或者常量池中(字符串常量对象存放在常量池中 ...

  3. Android Spinner In Toolbar

    As the title of the post suggest in this tutorial we will see how to have spinner widget inside the ...

  4. 用户空间和内核空间通讯之【Netlink 上】

    原文地址:用户空间和内核空间通讯之[Netlink 上] 作者:wjlkoorey258 引言 Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接 ...

  5. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解【转】

    http://www.cnblogs.com/qinpengming/archive/2013/06/08/3127346.html 1,什么是ODF .NE,?就是Oracle 为 .NET (OD ...

  6. 在windows搭建jenkins測试环境

    jenkins 搭建好开发环境必备之中的一个,简单易用,搭建測试平台非常有帮助,不知道的都能够了解一下 官网下载地址 http://jenkins-ci.org/ 我是下载window版本号的 安装有 ...

  7. Andfix热修复框架原理及源代码解析-上篇

    热补丁介绍及Andfix的使用 Andfix热修复框架原理及源代码解析-上篇 Andfix热修复框架原理及源代码解析-下篇 1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用 ...

  8. 各类免费的API接口分享,无限次

    各类免费的API接口分享: 手机号码归属地API:https://www.juhe.cn/docs/api/id/11 历史上的今天API:https://www.juhe.cn/docs/api/i ...

  9. 高阶函数:sorted

    排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的 ...

  10. PHP session回收机制(转)

    由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...