Flask:web表单
客户端发送的所有通过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表单的更多相关文章
- 轻量级Web框架Flask——Web表单
安装 Flask-WTF及其依赖可使用pip安装 pip install flask_wtf 配置 要求应用配置一个密钥.密钥是一个由随机字符构成的唯一字符串,通过加密或签名以不同的方式提升应用的安全 ...
- flask web 表单验证 WTForms
简介 WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,它在flask-WTF的基础上扩展并添加了一些随手可得的精巧帮助函数,这些函数将会是在flask里使用表单更加 ...
- Flask Web Development —— Web表单(上)
Flask-WTF扩展使得处理web表单能获得更愉快的体验.该扩展是一个封装了与框架无关的WTForms包的Flask集成. Flask-WTF和它的依赖集可以通过pip来安装: (venv) $ p ...
- Flask学习 三 web表单
web表单 pip install flask-wtf 实现csrf保护 app.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程 ...
- flask 利用flask_wtf扩展 创建web表单
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开 ...
- Python——Flask框架——Web表单
一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...
- Flask教程 —— Web表单(上)
第二章中介绍的request对象公开了所有客户端发送的请求信息.特别是request.form可以访问POST请求提交的表单数据. 尽管Flask的request对象提供的支持足以处理web表单,但依 ...
- Flask之模板web表单
3.3 Web表单: web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过 ...
- Flask 教程 第三章:Web表单
本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你如何使用Web表单. 在第二章中 ...
随机推荐
- 洛谷1373小a和uim之大逃离
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- WebStorm添加多个项目到当前工程目录
File-> Settings -> Directories -> Add Content Root,选择你要加入的Project 点击OK -> Apply -> OK ...
- [转]使用Wireshark来检测一次HTTP连接过程
Wireshark是一个类似tcpdump的嗅探软件,界面更人性化一些,今天我用它来检测一次HTTP连接过程. 安装好之后,先配置一下,选择Capture->Options,先设定你要嗅探的网络 ...
- 学习和家庭教育 z
大家好,我是王宁. 今天能站在这里,纯属偶然. 为什么说偶然呢? 因为,南雅是个人才济济的地方,164班是一个优秀的集体. 个人认为,班级前二十几名的同学,时机适宜,谁考班上第一名都有可能. 妈妈对我 ...
- dogpile搜索引擎
有发现了一个新的搜索引擎——dogpile,结果还不错.据说是综合了多个搜索引擎的结果,展现了最终的搜索结果. 从百科上介绍说,这是一个[元搜索引擎].不懂,继续百科之,如下: 搜索引擎分为全文搜索引 ...
- python logging模块学习(转)
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- HTML5 Canvas 绘制星条旗
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- 一群牛人翻译:The Swift Programming Language 中文版
无聊闲逛GIthub,看到一群牛人在github上创建了一个关于Switf的文档翻译项目 The Swift Programming Language 中文版 项目地址:中文版 Apple 官方 Sw ...
- Android开发系列(二十三):实现带图片提示的Toast提示信息框
Android中的Toast是非经常见的一个消息提示框.可是默认的消息提示框就是一行纯文本.所以我们能够为它设置一些其它的诸如是带上图片的消息提示. 实现这个非常easy: 就是定义一个Layout视 ...
- java查看工具jstack-windows
Prints Java thread stack traces for a Java process, core file, or remote debug server. This command ...