用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
目录
前文列表
用 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.')
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验的更多相关文章
- 用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
目录 目录 前文列表 实现 post 视图函数 在 posthtml 中添加表单 效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hell ...
- 用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 实现所需要的视图函数 实现 home.html 模板 代码分析 实现效 ...
- 用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 使用 Bootstrap 编写 Jinja 模板文件 继承一 ...
- 用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
目录 目录 前文列表 视图函数 在 viewspy 文件中定义视图函数 定义右侧边栏的视图函数 为每一张数据表定义视图函数 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask ...
- 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 Jinja 中常用的过滤器 default float int len ...
- 用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
#目录 前文列表 扩展阅读 Jinja 变量名 注释 控制语句 if 语句 循环 过滤器 无参数调用 带参数调用 宏 定义宏 调用宏 结果 兼容 JavaScript 前文列表 用 Flask 来写个 ...
- 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
目录 目录 前文列表 扩展阅读 定义数据模型 models 创建表 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 ...
- 用 Flask 来写个轻博客
用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
随机推荐
- 动态创建类/ swizzle class
动态创建类 Class subclass = objc_allocateClassPair(baseClass, subclassName, );//生成,指定父类 //添加方法,变量...一些操作 ...
- 4.tensorflow——CNN
1.CNN结构:X-->CONV(relu)-->MAXPOOL-->CONV(relu)-->FC(relu)-->FC(softmax)-->Y 1.1 卷积层 ...
- 【读书笔记】:MIT线性代数(4):Independence, Basis and Dimension
Independence: The columns of A are independent when the nullspace N (A) contains only the zero vecto ...
- 【一起学源码-微服务】Nexflix Eureka 源码三:EurekaServer启动之EurekaServer上下文EurekaClient创建
前言 上篇文章已经介绍了 Eureka Server 环境和上下文初始化的一些代码,其中重点讲解了environment初始化使用的单例模式,以及EurekaServerConfigure基于接口对外 ...
- linux下部署springboot vue项目
使用的工具是 XFTP5 XSHELL5 docker pull gmaslowski/jdk 拉取jdk docker images 查询下载的镜像ID (如:390b58b1be42) docke ...
- Action.c(28): Error -27796: Failed to connect to server "xxxx": [10060] Connection timed out
Error -27796: Failed to connect to server "125.93.51.230:8080": [10061] Connection refused ...
- [fw]用Kprobes调试(debug)内核
Kprobes是一种运行时动态调试内核的机制, 你可以用它设置断点并收集调试信息, 甚至改变内核行为. Kprobes分三种, 普通kprobes以及基于普通kprobes的jprobes和kretp ...
- java虚拟机规范(se8)——class文件格式(四)
4.7 属性 属性用于class文件格式中的ClassFile,field_info,method_info和Code_attribute结构. 所有的属性都是下面的格式: attribute_inf ...
- 空类的sizeof,有一个虚函数的类的sizeof
今天面试,忽然被问到这个题目,查了一下果然有欸. #include <iostream> using namespace std; class A { }; class B { publi ...
- samba 添加新用户
添加samba新用户需要有root权限 1. 在Linux服务器根目录下(黄色背景部分是需替换部分:换成你自己的用户名) sudo smbpasswd -a username 2. 修改samba配置 ...