Flask教程 —— Web表单(上)
第二章中介绍的request
对象公开了所有客户端发送的请求信息。特别是request.form
可以访问POST
请求提交的表单数据。
尽管Flask的request
对象提供的支持足以处理web表单,但依然有许多任务会变得单调且重复。表单的HTML代码生成和验证提交的表单数据就是两个很好的例子。
Flask-WTF扩展使得处理web表单能获得更愉快的体验。该扩展是一个封装了与框架无关的WTForms包的Flask集成。
Flask-WTF和它的依赖集可以通过pip来安装:
(venv) $ pip install flask-wtf
1、跨站请求伪造(CSRF)保护
默认情况下,Flask-WTF保护各种形式对跨站请求伪造(CSRF)攻击。一个CSRF攻击发生在一个恶意网站发送请求给受害者登录的其他网站。
为了实现CSRF保护,Flask-WTF需要应用程序去配置一个加密密钥。Flask-WTF使用这个密钥去生成加密令牌用于验证请求表单数据的真实性。示例4-1展示如何配置加密密钥。
示例4-1. hello.py:Flask-WTF配置
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config
字典通常是框架、扩展或应用程序自身存放配置变量的地方,可以使用标准字典语法添加配置值到app.config
中。配置对象提供方法来从文件或环境导入配置值。
SECRET_KEY
配置变量作为Flask和一些第三方扩展的通用加密密钥。加密的强度取决于这个变量的值。给你构建的每个应用程序选择不同的密钥,并确保这个字符串不被其他任何人知道。
注:为了提高安全性,密钥应该存储在一个环境变量中,而不是嵌入到代码中。这个会在第7章中描述。
2、表单类
使用Flask-WTF时,每个web表单是由继承自Form
类的子类来展现的。该类在表单中定义了一组表单域,每个都表示为一个对象。每个表单域都可以连接到一个或多个validators;validators
是一个用于检查用户提交的输入是否合法的函数。
示例4-2展示了一个拥有文本框和提交按钮的简单web表单。
示例4-2. hello.py:表单类定义
from flask.ext.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')
表单中的域被定义为类的变量,且每个类的变量都指定一个表单域类型对象。在上一个示例中,NameForm
表单有一个name
文本框和submit
提交按钮。StringField
类表示一个type="text"
属性的<input>
标签。SubmitField
类表示一个type="submit"
属性的<input>
标签。表单域构造函数的第一个参数是一个label
,在渲染表单到HTML时会使用。
StringField
构造函数包含可选参数validators
,它定义了一组检查来验证用户提交的数据。Required()
验证确保提交的表单域不为空。
注:Flask-WTF扩展定义了表单基类,所以它从flask.ext.wtf导入。表单域、验证都是直接从WTForms包中导入。
表格4-1展示了一组WTForms支持的标准表单域。
表格4-1. WTForms标准HTML表单域
表格4-2展示了一组WTForms内建验证。
表格4-2. WTForms验证
3、HTML渲染的表单
表单域是可调用的,调用时从模板渲染它们到HTML。假设视图函数传递一个参数名为form
的NameForm
实例给模板,模板就会生成一个简单的HTML表单,如下所示:
<form method="POST">
{ { form.name.label }} { { form.name() }}
{ { form.submit() }}
</form>
当然,结果是什么都没有。为了改变表单的外观显示,任何发送给该表单域的参数会被转换为HTML表单域属性;例如,你可以给定表单域id
或class
属性,然后定义CSS样式:
<form method="POST">
{ { form.name.label }} { { form.name(id='my-text-field') }}
{ { form.submit() }}
</form>
即使有HTML属性,努力用这种方式渲染表单是非常重要的,所以最好是尽可能的使用Bootstrap自带的一系列表单样式。Flask-Bootstrap使用Bootstrap的预定义表单样式来提供高级的帮助函数来渲染整个Flask-WTF表单,这些操作都只需要一个调用即可完成。使用Flask-Bootstrap,上一个表单可以像下面这样来渲染:
{ % import "bootstrap/wtf.html" as wtf %}
{ { wtf.quick_form(form) }}
import
指令和常规的Python脚本一样的作用并且允许模板元素被导入并在许多模板中使用。被导入的bootstrap/wtf.html
文件,定义了帮助函数使用Bootstrap来渲染Flask-WTF表单。wtf.quick_form()
函数传入Flask-WTF表单对象并使用默认Bootstrap样式渲染它。示例4-3展示了完整的hello.py
模板。
示例4-3. templates/index.html:使用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 %}
目前模板的内容区有两块。第一块是类为page-header
的div输出一个问候语。这里使用了模板条件判断语句。在Jinja2中格式为{ % if variable %}...{ % else %}...{ % endif %}
。如果判断条件为True
则渲染if
和else
之间的内容。如果判断条件为False
则渲染else
和endif
之间的内容。示例模板会渲染字符串“Hello, Stranger!”当name
模板参数未定义的时候。第二块内容使用wtf.quick_form()
函数渲染NameForm
对象。
Flask教程 —— Web表单(上)的更多相关文章
- Python——Flask框架——Web表单
一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...
- Flask Web Development —— Web表单(上)
Flask-WTF扩展使得处理web表单能获得更愉快的体验.该扩展是一个封装了与框架无关的WTForms包的Flask集成. Flask-WTF和它的依赖集可以通过pip来安装: (venv) $ p ...
- Flask 教程 第三章:Web表单
本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你如何使用Web表单. 在第二章中 ...
- Flask学习之三 web表单
本部分Miguel Grinberg教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/webforms.html 开源中国的:http://ww ...
- 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('计划开 ...
- Flask之模板web表单
3.3 Web表单: web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过 ...
- Flask:web表单
客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理we ...
- Flask开发系列之Web表单
Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_template app = Flask(__name__) @app.ro ...
随机推荐
- Asp.Net 之 <%%>相关内联代码块用法
1.<%@ ... %> 用来添加命名空间引用,如:<%@ import namespace="system.data"> 2.<% ... %> ...
- Silverlight 之 断点调试
silverlight程序经常会遇到无法调试的情况,下面来总结解决方案. 一.问题描述 在Silverlight开发过程中,经常时不时的会碰到Silverlight无法调试的问题.如下几种情况: 1. ...
- 深入研究嵌入式web服务器的视频监控应用
http://embed.chinaitlab.com/pc/776136.html uCLinux下,主要有3个Web Server:Httpd.Thttpd和BOA.Httpd是最简单的一个Web ...
- jQuery(一)引入
一.jQuery简介 jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多) 二.安装 2.1.下载 下载地址:http://jq ...
- JDK5.0 特性 监控与管理虚拟机
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...
- android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
AsyncHttpClient开源框架android-async-http还是非常方便的. AsyncHttpClient该类通经常使用在android应用程序中创建异步GET, POST, PUT和 ...
- B/S与C/S的差别
前一段时间已经结束了C/S的学习,開始了B/S的旅程,那么为什么我们要学习这两个,这两个有什么差别呢?这些差别你知道多少呢? B/S结构.即Browser/Server(浏览器/server)结构.是 ...
- 算法笔记_173:历届试题 斐波那契(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 .... (x=1,2) f(x) = f(x-1) + f(x-2) ... ...
- 文本挖掘之文本聚类(OPTICS)
刘 勇 Email:lyssym@sina.com 简介 鉴于DBSCAN算法对输入参数,邻域半径E和阈值M比较敏感,在参数调优时比较麻烦,因此本文对另一种基于密度的聚类算法OPTICS(Order ...
- IntelliJ IDEA java项目导入jar包,打jar包
一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File -> Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Proje ...