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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 目录目录前文列表WTFormsWTF 的基础使用常用的字段类型fieldsDateFieldfieldsIntegerFieldfieldsFloatFieldfieldsStringFieldfieldsRadioFieldfieldsSel...

目录

前文列表

用 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.')
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
JSON 前端开发 数据安全/隐私保护
通过一个form表单的渲染演示,Flask的request,重定向语法
通过一个form表单的渲染演示,Flask的request,重定向语法
57 0
通过一个form表单的渲染演示,Flask的request,重定向语法
|
7月前
|
存储 移动开发 JavaScript
Flask狼书笔记 | 04_表单
4 表单 表单是和用户交互最常见的方式之一,本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。(p104) 4.1 HTML表单
68 0
|
7月前
|
数据库 数据安全/隐私保护 开发者
WTForms在Flask中的应用:创建与验证表单
【4月更文挑战第16天】本文介绍了如何在Flask应用中使用WTForms进行表单处理。首先,通过`pip install WTForms`安装库,并在配置文件中启用CSRF保护。接着,创建表单类,如`RegistrationForm`,包含所需字段及验证规则。在视图函数中处理表单提交,验证数据并进行相应操作。最后,在模板中渲染表单,显示标签、输入字段及验证错误信息。WTForms提供便捷的表单创建和验证,增强应用交互性和安全性。
|
7月前
|
数据库 数据安全/隐私保护 开发者
Flask表单处理:让Web交互更轻松
【4月更文挑战第16天】本文介绍了Flask中处理表单的基本流程和实用技巧。使用Flask-WTF扩展创建表单类,如`RegistrationForm`,包含字段及验证器。在模板中渲染表单,接收并处理数据,如`register`视图函数中的`form.validate_on_submit()`。技巧包括自定义验证器、CSRF保护、动态表单字段和文件上传。Flask-WTF使Web交互更便捷,增强了安全性与灵活性。
|
7月前
|
前端开发 Python
Web 框架 Flask 快速入门(二)表单
🌴 表单 1、表单介绍 当我们在网页上填写账号密码进行登录的时候,就是在填写一个“表单”。web表单是web应用程序种最基本的功能。 2、表单的简单实现 下面的代码实现了这样的功能:
77 0
|
存储 前端开发 安全
如何优雅的使用FlaskWeb表单,快速掌握Flask-WTF
Flask-WTF扩展可以把处理Web表单的过程变成一种愉悦的体验。这个扩展对独立的WTForms包进行了包装,方便集成到Flask应用中。 Flask-WTF及其依赖可使用pip安装:
725 0
如何优雅的使用FlaskWeb表单,快速掌握Flask-WTF
|
Java Python
基于Flask创建Python服务端,并调用Java客户端
基于Flask创建Python服务端,并调用Java客户端
175 0
|
JavaScript 前端开发 Python
基于Flask创建Python服务端,并调用JavaScript客户端
基于Flask创建Python服务端,并调用JavaScript客户端
101 0
|
C# Python
基于Flask创建Python服务端,并调用Python客户端、C#客户端
基于Flask创建Python服务端,并调用Python客户端、C#客户端
173 0
|
Python
Python编程:Flask表单扩展Flask-WTF
Python编程:Flask表单扩展Flask-WTF
134 0
Python编程:Flask表单扩展Flask-WTF