1.安装

pip3 install flask-wtf -i https://pypi,doban.com/simple

2.实例化

exts

from flask_wtf.csrf import CSRFProtectcsrf = CSRFProtect()

apps.py

from flask import Flaskfrom exts import csrf
from flask_wtf.csrf import CSRFProtectdef create_app():app = Flask(__name__)# 第一种绑定app# csrf = CSRFProtect(app)# 第二种绑定appcsrf.init_app(app)# 必须需要设置SECRET_KEY这个配置项,form依赖sessionapp.config['SECRET_KEY'] = 'fgfhdf4564'return app

3.使用

WTForms支持HTML字段:

WTForms支持HTML字段:

字段类型 说明
StringField 文本字段, 相当于type类型为text的input标签
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段, 值为datetime.date格式
DateTimeField 文本字段, 值为datetime.datetime格式
IntegerField 文本字段, 值为整数
DecimalField 文本字段, 值为decimal.Decimal
FloatField 文本字段, 值为浮点数
BooleanField 复选框, 值为True 和 False
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表, 可选择多个值
FileField 文件上传字段
SubmitField 表单提交按钮
FormFiled 把表单作为字段嵌入另一个表单
FieldList 子组指定类型的字段

Validators验证器

WTForms可以支持很多表单的验证函数:

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

基础使用

form.py

from flask_wtf import FlaskForm
from wtforms import StringField, TextField, PasswordField
from wtforms.validators import DataRequired, ValidationErrorclass UserForm(FlaskForm):name = StringField(label='name', validators=[DataRequired(message='用户名不能为空')])password = PasswordField('name', validators=[DataRequired()])def validate_name(self, name):print('=============>', name.data)if name.data == 'a':raise ValidationError('不能是a')

view.py

@user_bp.route('/', methods=['get', 'post'])
def login():form = UserForm()if form.validate_on_submit():# 验证通过会返回Truepass# print('--------->', form.name.data)return render_template('login.html', form=form)

html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="" method="post">{{form.csrf_token}}
{# label为表单类中定义此属性函数的第一个参数,如果需要添加样式,可以为字段指定id或class属性 #}{{ form.name.label }}{{ form.name(id = 'username') }}<br>{{ form.password.label }}{{ form.password }}<br><input type="submit">
</form>
</body>
</html>

文件上传

Flask-WTF 提供 FileField 来处理文件上传,它在表单提交后,自动从 flask.request.files 中抽取数据。FileField 的 data 属性是一个 Werkzeug FileStorage 实例

form

from flask_wtf import FlaskForm
from flask_wtf.file import FileRequired, FileAllowed
from wtforms import StringField, TextField, PasswordField, FileField
from wtforms.validators import DataRequired, ValidationErrorclass PhotoForm(FlaskForm):name = StringField(label='name', validators=[DataRequired(message='用户名不能为空')])password = PasswordField('name', validators=[DataRequired()])icon = FileField(label='用户头像', validators=[FileRequired(), FileAllowed(['jpg', 'png', 'gif'], message='必须是图片文件格式')])def validate_name(self, name):print('=============>', name.data)if name.data == 'a':raise ValidationError('不能是a')

view

from werkzeug import secure_filename
from flask_wtf.file import FileFieldclass PhotoForm(Form):photo = FileField('Your photo')@app.route('/upload/', methods=('GET', 'POST'))
def upload():form = PhotoForm()if form.validate_on_submit():# 校验文件名称filename = secure_filename(form.photo.data.filename)form.photo.data.save('uploads/' + filename)else:filename = Nonereturn render_template('upload.html', form=form, filename=filename)

html

<form action="/upload/" method="POST" enctype="multipart/form-data">....
</form>

校验

自定义Validators验证器

第一种: in-line validator(内联验证器)
也就是自定义一个验证函数,在定义表单类的时候,在对应的字段中加入该函数进行认证。下面的my_length_check函数就是用于判name字段长度不能超过50.

def my_length_check(form, field):if len(field.data) > 50:raise ValidationError('Field must be less than 50 characters')class MyForm(Form):name = StringField('Name', [InputRequired(), my_length_check])

可重用的验证函数

一般是以validate开头,加上下划线再加上对应的field字段(validate_filed),浏览器在提交表单数据时,会自动识别对应字段所有的验证器,然后执行验证器进行判断。

class RegistrationForm(FlaskForm):email = StringField('Email', validators=[DataRequired(), Length(1, 60), Email()])username = StringField('Username', validators=[DataRequired(), Length(1, 60),Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, 'username must have only letters, numbers dots or underscores')])password = PasswordField('Password', validators=[DataRequired(), EqualTo('password2', message='password must match')])password2 = PasswordField('Confirm password', validators=[DataRequired()])def validate_email(self, field):if User.objects.filter(email=field.data).count() > 0:raise ValidationError('Email already registered')def validate_username(self, field):if User.objects.filter(username=field.data).count() > 0:raise ValidationError('Username has exist')

高级的validators

class Length(object):def __init__(self, min=-1, max=-1, message=None):self.min = minself.max = maxif not message:message = u'Field must be between %i and %i characters long.' % (min, max)self.message = messagedef __call__(self, form, field):l = field.data and len(field.data) or 0if l < self.min or self.max != -1 and l > self.max:raise ValidationError(self.message)length = Length

Widget组件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms import validators
from wtforms import widgetsclass LoginForm(Form):name = simple.StringField(label='用户名',validators=[validators.DataRequired(message='用户名不能为空.'),],widget=widgets.TextInput(),render_kw={'class': 'form-control'})pwd = simple.PasswordField(label='密码',validators=[validators.DataRequired(message='密码不能为空.'),],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})

参考连接

Flask-WTF与WTForms的用法详解 - 简书 (jianshu.com)https://www.jianshu.com/p/7e16877757f8

flask入门到起飞(五) flask-wtf使用 - 简书 (jianshu.com)https://www.jianshu.com/p/3fd2a1f155f3

flask---》Flask-WTF相关推荐

  1. Web框架——Flask系列之WTF表单验证练习(七)

    一.Web表单 web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将 ...

  2. Flask(十六)——WTF

    Web应用程序的一个重要方面是为用户提供一个用户界面. HTML提供了一个 <form> 标签,用于设计一个接口. 可以适当使用表单的元素,如文本输入,广播,选择等. 通过GET或POST ...

  3. 【flask】04.wtf表单的全部用法实现

    学到了flask wtf 表单,网上想查看一下wtf表单的全部用法,结果都是StringFiled SubmitField PasswordField的用法, 反正都是学习,结合源码和借鉴(抄袭~~) ...

  4. 【Flask】flask上下文

    上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情. Flask中有两种上下文,请 ...

  5. 【Flask】flask入门以及第一个flask项目的创建

    一.Flask介绍 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三 ...

  6. Flask框架(flask中的蓝图Blueprint)

    1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...

  7. Flask框架(flask模板(jinja2)与字符串过滤器、列表过滤器以及自定义过滤器)

    模板变量 : {{name}} 1. 模板的定义: 模板变量 : {{name}} 2. 模板的渲染:  render_template("模板名字",键=值,键=值)       ...

  8. Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)

    1.  SQLAlchemy是一个关系型数据库框架, 它提供了高层的ORM和底层的原生数据库的操作. flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展. 2. 安装 ...

  9. Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)

    1.请求上下文与应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...

  10. Flask框架(flask中设置和获取session)

    1. session 数据是保存到后端的数据库中 2.session中的从狭义和广义上分:   (1)session,广义上 :          是一种机制:在前端当中存一个session_id , ...

最新文章

  1. list 去重_测试面试题集Python列表去重
  2. python是不是特别垃圾-Python 这语言真是混乱和原始
  3. 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
  4. 《自顶向下网络设计(第3版)》——导读
  5. Win11将沿用Win10升级模式 并会有LTSC版本
  6. python调用动态链接库传送protobuf数据。
  7. 互联网人必读 | 大数据思维的十大核心原理
  8. 从键盘读取数据,回车才能显示的问题
  9. RESTful-rest_framework视图层-第三篇
  10. Caffe+CUDA8.0+CuDNNv5.1+OpenCV3.1+Ubuntu14.04 配置参考文献 以及 常见编译问题总结
  11. Android webview调用本地文件选择失败解决
  12. 计算机怎么在表格里打勾,怎样在Excel输入对号√,Excel单元格怎么输入对号(方框内打勾)?...
  13. 2021年 阿里云商标注册申请的相关详情及分类介绍
  14. php 输入经纬度查询位置,PHP根据一个给定经纬度的点,进行附近地点查询
  15. CTF 你就是长不了
  16. matlab 非圆齿轮,非圆齿轮参数化设计关键技术研究
  17. 理想汽车确认首席技术官王凯离职
  18. 64位系统最大支持多少内存
  19. 《用户行为画像》学习(1-4章)
  20. jpype踩的那些坑

热门文章

  1. tkinter - 使用Pyinstall进行打包封装
  2. 安卓漏洞(apk破解总览)
  3. 大数据实战项目------中国移动运营分析实时监控平台 || 项目需求实现(文章最后有数据文件)
  4. 11.修改数据库字符编码
  5. 智能垃圾桶(十)——智能垃圾桶拆机报告
  6. JUC之 completableFuture
  7. 区分回归问题和分类问题
  8. python学习之socket模块网络通信的异常信息汇总
  9. Android 视频 短视频录制
  10. java-Native.toString(xxx)乱码