• 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验


    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.')
  • 相关阅读:
    JDBC遇到向ORACLE数据库表执行插入操作时,报错“列在此处不允许”
    关于对称加密和非对称加密以及签名,认证和证书的理解
    .net framework 各版本区别
    数据库设计三大范式
    业务系统设计
    修改 Windows 服务器默认远程端口3389
    iis读取不到本地证书问题 提示已经导入成功
    HTTPS 建立连接的详细过程
    使用ServiceStack构建Web服务
    转-微信支付(公众号支付JSAPI)
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/10589866.html
Copyright © 2020-2023  润新知