Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog
目录
前文列表
用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
WTForms
WTForms:是一个服务端表单检验库,用于在保证安全的前提下,对常见的表单类型进行输入的合法性验证。除此之外,还提供了 Jinja HTML 渲染、预防跨域请求伪造(CSRF)、SQL 注入。
- 安装
(env) [root@flask-dev JmilkFan-s-Blog]# pip install Flask-WTF
(env) [root@flask-dev JmilkFan-s-Blog]# pip freeze > requirements.txt
- 生成密钥
NOTE 1: WTF 的安全措施的执行需要我们提供一个*安全密钥,用于生成加密的签名,在所有需要验证真实性的所有地方都会用到这个签名。
(env) [root@flask-dev JmilkFan-s-Blog]# cat /dev/urandom | tr -cd 'a-f0-9' | head -c 32
- 将密钥写入配置项
class Config(object):
"""Base config class."""
SECRET_KEY = '你的密钥'
class ProdConfig(Config):
"""Production config class."""
pass
class DevConfig(Config):
"""Development config class."""
DEBUG = True
# MySQL connection
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:fanguiju@127.0.0.1:3306/myblog?charset=utf8'
WTF 的基础使用
WTForms 由 字段、检验器、表单 三部分组成:
字段:表示表单的输入框,会做一些初步的输入检查
检验器:是一组被附加到字段(输入框)上的函数,用于对输入数据的检验,确保输入我们期望的数据
表单:是一个 Python 类,其中包含了 字段(类属性) 和 检验器,在接收到 HTTP POST 请求时,会根据定义的检验器规则来对输入数据进行检验
from flask_wtf import Form
from wtforms import StringField, TextField
from wtforms.validators import DataRequired, Length
class CommentForm(Form):
"""Form vaildator for comment."""
# Set some field(InputBox) for enter the data.
# patam validators: setup list of validators
name = StringField(
'Name',
validators=[DataRequired(), Length(max=255)])
text = TextField(u'Comment', validators=[DataRequired()])
NOTE 1:表单类需要继承 Flask WTF 扩展提供的 Form 类
NOTE 2:表单类中的一个类属性,就代表了一个字段,即输入框。wtforms 提供了多种类型的字段类
NOTE 3:字段类的第一个参数为输入框标题,第二个参数为绑定到该字段的检验器列表,由 wtforms.validators 提供
- 将 wt_forms 模块导入到 main.py 中:
from flask import Flask
from config import DevConfig
import wt_forms
app = Flask(__name__)
# Import the views module
views = __import__('views')
# Get the config from object of DecConfig
app.config.from_object(DevConfig)
if __name__ == '__main__':
app.run()
常用的字段类型
每一种字段类型都对应了一个 Form 组件。
fields.DateField
对应了 Python 中的 Date 对象,可以接收一个 format 可选参数来设定 Date 格式,该参数需要传入一个 strftime(格式化输出时间) 的字符串。
fields.IntegerField
将提交的数据强制转换成为整数,并在模板上渲染成为一个数字类型的输入框。
fields.FloatField
将提交的数据强制转换成为浮点数,并在模板上渲染成为一个数字类型的输入框。
fields.StringField
普通的文本输入框,会将输入的内容强制转换成为 String 类型对象。
fields.RadioField
代表一组单项选择框,接收一个 choices 参数,该参数需要传入一个以 Tuple 为元素的 List 类型对象,这些参数值表示了显示的选项和返回值。
fields.SelectField/fields.SelectMultipleField
代表一组单选/多选框,接收一个 choices 参数,该参数需要传入一个以 Tuple 为元素的 List 类型对象,代表选项的显示内容和返回值。
常用的检验器
WTForms 的检验器
一般能够通过其命名来得知其作用,所有的检验器都能够接收一个 message 参数,该参数表示了输入的数据没有通过验证时,返回的错误信息。
- validators.DataRequired()
- validators.Email()
- validators.Length(min=-1, max=-1)
- validators.NumberRange(min=None, max=None)
- validators.Optional()
- validators.Regexp(regex)
- validators.URL()
自定义检验器
自定义检验器所需要做的事情就是:实现一个函数 接收表单对象和字段对象作为参数 当没有通过验证时,触发一个 wtform.VaildationError 异常 .
import re
from wtforms import ValidationError
def custom_email(form_object, field_object):
"""Define a vaildator"""
if not re.match(r"[^@+@[^@]+.[^@]]+", field_object.data):
raise ValidationError('Field must be a valid email address.')