文章目录
  1. 1. 表单
  2. 2. 表单类
  3. 3. CSRF保护

表单

表单的功能就是在网页中采集数据,其实表单就相当于我们平时用来提交资料、意见,规范流程执行过程的格式。一个表单有三个基本组成部分:

  • 表单标签(<form></form>):用于申明表单,定义采集数据的范围,将<form></form>里面包含的数据将提交到服务器。
  • 表单域:用于采集用户输入或选择的数据。包括有文本框、多行文本框、密码框、隐藏域、复选框、单选框和下拉选择框等。
  • 表单按钮:用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。有提交按钮、复位按钮和一般按钮。

WTForms是一个Python表单验证、渲染开发包,其中有许多HTML标准字段和内建的验证函数。

  • 这些标准字段本质上是在wtforms中定义的类,有以下这些:

    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:一组指定类型的字段

  • 而验证函数则是用来验证用户填写在表单中并提交的输入值是否符合要求的函数,有以下这些:

    Email:验证电子邮件地址
    EqualTo:比较两个字段的值(常用于要求输入两次密码进行确认的情况)
    IPAddress:验证IPv4网络地址
    Length:验证输入字符串的长度
    NumberRange:验证输入的值在数字范围内
    Optional:无输入值时跳过其他的验证函数
    Required:确保字段中有数据(确保用户输入不为空)
    Regexp:使用正则表达式验证输入值
    URL:验证URL
    AnyOf:确保输入值在可选值列表
    NoneOf:确保输入值不在可选值列表

flask里的一个扩展:Flask-WTF,提供了简单的WTForms 集成。那么我们来安装这个flask扩展flask-wtf:

1
(venv) $ pip install flask-wtf

表单类

使用Flask-WTF时,每一个Web表单都是一个继承自Form的类。表单类定义了表单中的字段,每一个字段都是WTForms中的字段类的实例。那么我们来给我们的hello.py定义一个表单类试试,在hello.py插入以下代码:

1
2
3
4
5
6
7
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')

1.首先,从flask.ext.wtf里导入Form类
2.从wtforms导入StringField、SubmitField类
3.从wtforms。validators导入Required验证函数
4.定义NameForm类,这个类继承自Form类
5.NameForm表单类中定义了一个叫name的文本字段,这个name是StringField类的实例。StringField类的构造函数中的可选参数validators指定了一个列表,这个列表由验证函数组成,在接受用户提交的数据之前验证数据。这里这个列表中有Required()验证函数,确保用户提交的字段不为空。
6.NameForm中还定义了一个叫submit的表单提交按钮,这个submit是SubmitField类的实例。SubmitField类的构造函数的第一个参数就是把表单渲染成HTML时所使用的标号,这里为‘Submit’。

这样就定义了一个表单类了,这个表单的作用就是填写用户的名字并提交。

CSRF保护

这里还要注意一点,在使用WTF的时候,我们还必须要先设置一下app实例里的SECRET_KEY,否则就会引发错误。而这个设置是为了实现CSRF保护。

CSRF保护就是跨站请求伪造保护。默认情况下,Flask-WTF能够保护表单免受CSRF的攻击。

那么我们来给我们的程序设置一个密钥,Flask-WTF会使用这个密钥生成加密令牌,再用加密令牌验证请求中的表单数据的真伪。修改hello.py如下:

1
2
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'

config是实例app中的一个字典(字典是python的一种数据结构类型,由键和对应的值成对组成),用来储存了框架、扩展和程序本身的配置变量。这里把config中SECRET_KEY键的值设置为hard to guess string。SECRET_KEY这个配置变量就是通用密钥。

事实上,除了这样直接设置SECRET_KEY的值,我们还可以将密钥保存在文件或环境变量中,然后从文件或环境中导入其配置值。

Last:
Next:

文章目录
  1. 1. 表单
  2. 2. 表单类
  3. 3. CSRF保护