Flask Web Development —— Web表单(上)
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展示如何配置加密密钥。
示例1. hello.py:Flask-WTF配置
- app = Flask(__name__)
- app.config['SECRET_KEY'] = 'hard to guess string'
app.config
字典通常是框架、扩展或应用程序自身存放配置变量的地方,可以使用标准字典语法添加配置值到app.config
中。配置对象提供方法来从文件或环境导入配置值。
SECRET_KEY
配置变量作为Flask和一些第三方扩展的通用加密密钥。加密的强度取决于这个变量的值。给你构建的每个应用程序选择不同的密钥,并确保这个字符串不被其他任何人知道。
注:为了提高安全性,密钥应该存储在一个环境变量中,而不是嵌入到代码中。这个以后会给出详细描述。
2、表单类
使用Flask-WTF时,每个web表单是由继承自Form
类的子类来展现的。该类在表单中定义了一组表单域,每个都表示为一个对象。每个表单域都可以连接到一个或多个validators;validators
是一个用于检查用户提交的输入是否合法的函数。
示例2展示了一个拥有文本框和提交按钮的简单web表单。
示例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样式渲染它。示例3展示了完整的hello.py
模板。
示例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 Development —— Web表单(上)的更多相关文章
- web网页的表单排版利器--960css
表单排版样式 960css 前言 一般web网页的表单排版,大家都习惯用table排版,自己需要根据实际需要去定义TR和TD,很多时候对于TD的高宽度.是否合并行,合并列,都要去做一些处理,这些都是比 ...
- ASP.NET Web Pages:表单
ylbtech-.Net-ASP.NET Web Pages:表单 1.返回顶部 1. ASP.NET Web Pages - HTML 表单 表单是 HTML 文档中放置输入控件(文本框.复选框.单 ...
- PHP流式上传和表单上传(美图秀秀)
最近需要开发一个头像上传的功能,找了很多都需要授权的,后来找到了美图秀秀,功能非常好用. <?php /** * Note:for octet-stream upload * 这个是流式上传PH ...
- Linux 基础命令-CURL 表单上传文件
CURL -F, --form <name=content> (HTTP) This lets curl emulate a filled-in form in which a user ...
- 一般处理程序上传文件(html表单上传、aspx页面上传)
html 表单上传文件 一般处理程序由于没有 apsx 页面的整个模型和控件的创建周期,而比较有效率.这里写一个用 html 表单进行文件上传的示例. 1. 表单元素选用 ...
- puzz: 图片和表单上传的不一致问题
1. 方向1 用户提交表单, 图片和表单同步上传.(由同一服务器处理, 服务器压力大. 没有分离) 2. 方向2 图片和表单分开上传. 如图片访问ftp,表单提交后台(图片和后台分离) 2 ...
- from 表单上传文件和下载?
from表单上传单个文件的方法. 分为三个部分,简单演示. 一部分 表单上传文件 <%-- Created by IntelliJ IDEA. User: Administrator Date: ...
- JsonResponse类的使用、form表单上传文件补充、CBV和FBV、HTML的模板语法之传值与过滤器
昨日内容回顾 Django请求生命周期 # 1.浏览器发起请求 到达Django的socket服务端(web服务网关接口) 01 wsgiref 02 uwsgi + nginx 03 WSGI协议 ...
- [转]html5表单上传控件Files API
表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...
- 文件的上传(表单上传和ajax文件异步上传)
项目中用户上传总是少不了的,下面就主要的列举一下表单上传和ajax上传!注意: context.Request.Files不适合对大文件进行操作,下面列举的主要对于小文件上传的处理! 资源下载: 一. ...
随机推荐
- 什么是条带化(striping) ?(转载)
条带(strip)是把连续的数据分割成相同大小的数据块,把每段数据分别写入到阵列中的不同磁盘上的方法.简单的说,条带是一种将多个磁盘驱动器合并为一个卷的方法. 许多情况下,这是通过硬件控制器来完成的. ...
- QQ音乐无损歌曲接口api
1.打开QQ音乐官网 y.qq.com 2.选择你要的歌曲,进入后查看网址,以虎口脱险这个歌曲为例:http://y.qq.com/#type=song&mid=000Ib8E71sUNi7 ...
- vsftp.conf
anonymous_enable=NO local_enable=YES write_enable=YES dirmessage_enable=YES xferlog_enable=YES xferl ...
- WM_INITDIALOG与WM_CREATE消息的区别
WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕(可以安全的使用这个窗口了,例如在它上面画控件等).在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说 ...
- Mac OS X Server 安装与应用
Mac OS X Server 安装与应用 Mac OS X Server是苹果电脑公司新一代服务器软件.专为OS X和iOS设备.Mac OS X提供服务,现在支持Mavericks,能够轻松共享文 ...
- Duilib学习笔记《04》— 窗体显示
在前面已经了解了duilib控件以及界面布局相关内容,接下来就要考虑该如何将xml中描述的布局通过界面展现出来.实际上在 Duilib学习笔记<01> 中我们已经简单提到过基本的流程及元素 ...
- python jinjia2模板使用
https://gist.github.com/wrunk/1317933 #!/usr/bin/env python # -*- coding: utf-8 -*- from jinja2 impo ...
- win7系统服务print spooler 无法启动解决方法(开启及关闭方法)
以下是小编从新浪博客一个大雕博客中找到的“print spooler 无法启动”解决方法,请您仔细参考. 在下的系统是Windows7正式版,因为经常要制作PDF文件,所以对虚拟打印机使用较多,在下的 ...
- ruby中symbol
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...
- Windows server 2008R2部署服务批量安装Windows7教程
利用Windows server 2008 R2下的Windows部署服务可以批量安装Windows 7,以下简称WDS. WDS需要用到域和dhcp.DNS服务,所以,基础环境必须要有域控制器,dh ...