flask---》Flask-WTF
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可以支持很多表单的验证函数:
验证函数 | 说明 |
---|---|
验证是电子邮件地址 | |
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相关推荐
- Web框架——Flask系列之WTF表单验证练习(七)
一.Web表单 web表单是web应用程序的基本功能. 它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将 ...
- Flask(十六)——WTF
Web应用程序的一个重要方面是为用户提供一个用户界面. HTML提供了一个 <form> 标签,用于设计一个接口. 可以适当使用表单的元素,如文本输入,广播,选择等. 通过GET或POST ...
- 【flask】04.wtf表单的全部用法实现
学到了flask wtf 表单,网上想查看一下wtf表单的全部用法,结果都是StringFiled SubmitField PasswordField的用法, 反正都是学习,结合源码和借鉴(抄袭~~) ...
- 【Flask】flask上下文
上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情. Flask中有两种上下文,请 ...
- 【Flask】flask入门以及第一个flask项目的创建
一.Flask介绍 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三 ...
- Flask框架(flask中的蓝图Blueprint)
1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...
- Flask框架(flask模板(jinja2)与字符串过滤器、列表过滤器以及自定义过滤器)
模板变量 : {{name}} 1. 模板的定义: 模板变量 : {{name}} 2. 模板的渲染: render_template("模板名字",键=值,键=值) ...
- Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)
1. SQLAlchemy是一个关系型数据库框架, 它提供了高层的ORM和底层的原生数据库的操作. flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展. 2. 安装 ...
- Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)
1.请求上下文与应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...
- Flask框架(flask中设置和获取session)
1. session 数据是保存到后端的数据库中 2.session中的从狭义和广义上分: (1)session,广义上 : 是一种机制:在前端当中存一个session_id , ...
最新文章
- list 去重_测试面试题集Python列表去重
- python是不是特别垃圾-Python 这语言真是混乱和原始
- 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
- 《自顶向下网络设计(第3版)》——导读
- Win11将沿用Win10升级模式 并会有LTSC版本
- python调用动态链接库传送protobuf数据。
- 互联网人必读 | 大数据思维的十大核心原理
- 从键盘读取数据,回车才能显示的问题
- RESTful-rest_framework视图层-第三篇
- Caffe+CUDA8.0+CuDNNv5.1+OpenCV3.1+Ubuntu14.04 配置参考文献 以及 常见编译问题总结
- Android webview调用本地文件选择失败解决
- 计算机怎么在表格里打勾,怎样在Excel输入对号√,Excel单元格怎么输入对号(方框内打勾)?...
- 2021年 阿里云商标注册申请的相关详情及分类介绍
- php 输入经纬度查询位置,PHP根据一个给定经纬度的点,进行附近地点查询
- CTF 你就是长不了
- matlab 非圆齿轮,非圆齿轮参数化设计关键技术研究
- 理想汽车确认首席技术官王凯离职
- 64位系统最大支持多少内存
- 《用户行为画像》学习(1-4章)
- jpype踩的那些坑