客户端发送的所有通过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. 如何使用Ext.create() 调用一个窗体

    Ext.define("Scripts.Code.QM.OutgoingQuality.OQC.ReinspRequest.view.DefectContentsDetailInfoWind ...

  2. Autolayout 01

    Auto Layout Concepts auto layout的基本概念是constraint(约束).表示了你interface中的layout元素.例如,你可以创建一个约束来指定元素的宽度或者距 ...

  3. andriod 支付宝类似界面图片加文字

    <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="ht ...

  4. Google SEO 学习网站记录

    在搜索结果中创建良好的标题和摘要: https://support.google.com/webmasters/answer/35624?hl=zh-Hans&ref_topic=600194 ...

  5. 如何将.class文件反编译为.java文件

    直接用jd-gui jad太麻烦了---------2014-12-19 23:24:04------反编译工具jad简单用法 以下假设jad.exe在c:\java目录下 一.基本用法 Usage: ...

  6. 一波三折ST-Link

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...

  7. maven springmvc-hibernate搭建以及源码下载

    见:https://blog.csdn.net/fengshizty/article/details/43635305 下载源码参见:http://www.cnblogs.com/ljy2013/p/ ...

  8. 转:十六进制颜色与RGB颜色对照表

    http://www.vis.cc/html/ppyj/zscs/1090.html 十六进制颜色查询 颜 色 英文代码 形象描述 十六进制 RGB LightPink 浅粉红 #FFB6C1 255 ...

  9. 1、C++的的升级

    1.C语言的缺点 (1)重用性差 (2)维护性差 2.C++ 从面向世界的需求出发来设计我们的程序, 3. 使用增强 A. ; i < ; i++) { } C语言编译器的话,会报错,因为C语言 ...

  10. Spring学习十一----------Bean的配置之基于Java的容器注解@Bean

    © 版权声明:本文为博主原创文章,转载请注明出处 @Bean -@Bean标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/> -可 ...