Flask-WTF
Flask-WTF 提供了简单地 WTForms 的集成。
官方文档:http://www.pythondoc.com/flask-wtf/index.html
功能
- 集成 wtforms。
- 带有 csrf 令牌的安全表单。
- 全局的 csrf 保护。
- 支持验证码(Recaptcha)。
- 与 Flask-Uploads 一起支持文件上传。
- 国际化集成。
WTForms
表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。当然还包括一些其他的功能:CSRF保护
,文件上传等。安装Flask-WTF
默认也会安装WTForms
,因此使用以下命令来安装Flask-WTF
:
pip install flask-wtf
Wtforms 表单验证:
安装完Flask-WTF
后。来看下第一个功能,就是用表单来做数据验证,现在有一个forms.py
文件,然后在里面创建一个RegistForm
的注册验证表单:
from wtforms import Form,StringField
from wtforms.validators import Length,EqualTo
class RegisterForm(Form):
name = StringField(validators=[Length(min=3,max=10,message='用户名为3~10个字符')])
password1= StringField(validators=[Length(min=6,max=10,message='密码为3~10个字符')])
password2 = StringField(validators=[EqualTo("password1",message='两次密码不一致')])
form = RegisterForm(request.form)
if form.validate():
RegistForm
传递的是request.form
进去进行初始化,并且判断form.validate
会返回用户提交的数据是否满足表单的验证。
Wtf常用验证器
数据发送过来,经过表单验证,因此需要验证器来进行验证,以下对一些常用的内置验证器进行讲解:
- Email:验证上传的数据是否为邮箱。
- EqualTo:验证上传的数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。
- InputRequired:原始数据的需要验证。如果不是特殊情况,应该使用
InputRequired
。 - Length:长度限制,有min和max两个值进行限制。
- NumberRange:数字的区间,有min和max两个值限制,如果处在这两个数字之间则满足。
- Regexp:自定义正则表达式。
- URL:必须要是
URL
的形式。 - UUID:验证
UUID
。
自定义验证字段:
使用validate_fieldname(self,field)
可以对某个字段进行更加详细的验证,如下:
class ProfileForm(Form):
name = wtforms.StringField('name',[validators.InputRequired()])
def validate_name(self,field):
#获取值:field.data
if len(field.data) > 5:
raise wtforms.ValidationError(u'超过5个字符')
field就是传入 的表单提交name值
Field常用参数:
在使用Field
的时候,经常需要传递一些参数进去,以下将对一些常用的参数进行解释:
- label(第一个参数):
Field
的label的文本。 - validators:验证器。
- id:
Field
的id属性,默认不写为该属性名。 - default:默认值。
- widget:指定的
html
控件。
常用Field:
- BooleanField:布尔类型的Field,渲染出去是
checkbox
。 FileField:文件上传Field。
# forms.py
from flask_wtf.file import FileField,FileAllowed,FileRequired
class UploadForm(FlaskForm):
avatar = FileField(u'头像:',validators=[FileRequired(),FileAllowed([])]) # app.py
@app.route('/profile/',methods=('POST','GET'))
def profile():
form = ProfileForm()
if form.validate_on_submit():
filename = secure_filename(form.avatar.data.filename)
form.avatar.data.save(os.path.join(app.config['UPLOAD_FOLDER'],filename))
return u'上传成功' return render_template('profile.html',form=form)
FloatField:浮点数类型的Field,但是渲染出去的时候是
text
的input。IntegerField:整形的Field。同FloatField。
RadioField:
radio
类型的input
。表单例子如下:# form.py
class RegistrationForm(FlaskForm):
gender = wtforms.RadioField(u'性别:',validators=[DataRequired()])
模板文件代码如下:
<tr>
<td>
{{ form.gender.label }}
</td>
<td>
{% for gender in form.gender %}
{{ gender.label }}
{{ gender }}
{% endfor %}
</td>
</tr>
app.py
文件的代码如下,给gender
添加了choices
:@app.route('/register/',methods=['POST','GET'])
def register():
form = RegistrationForm()
form.gender.choices = [('1',u'男'),('2',u'女')]
if form.validate_on_submit():
return u'success' return render_template('register.html',form=form)
SelectField:类似于
RadioField
。看以下示例:# forms.py
class ProfileForm(FlaskForm):
language = wtforms.SelectField('Programming Language',choices=[('cpp','C++'),('py','python'),('text','Plain Text')],validators=[DataRequired()])
再来看
app.py
文件:@app.route('/profile/',methods=('POST','GET'))
def profile():
form = ProfileForm()
if form.validate_on_submit():
print form.language.data
return u'上传成功'
return render_template('profile.html',form=form)
模板文件为:
<form action="/profile/" method="POST">
{{ form.csrf_token }}
{{ form.language.label }}
{{ form.language() }}
<input type="submit">
</form>
StringField:渲染到模板中的类型为
<input type='text'>
,并且是最基本的文本验证。PasswordField:渲染出来的是一个
password
的input
标签。TextAreaField:渲染出来的是一个
textarea
。
文件上传:
from werkzeug.datastructures import FileStorage
from werkzeug.utils import secure_filename
@app.route('/upload/',methods=['GET','POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
else:
file = request.files.get('avatar')
file.save(dst=secure_filename(file.filename))
pass
访问上传文件:
@app.route('/images/<filename>/')
def images(filename):
return send_from_directory(directory=os.path.dirname(__file__),filename=filename)
拾遗:
from werkzeug.datastructures import FileStorage,ImmutableDict,CombinedMultiDict
from werkzeug.utils import secure_filename
from flask_wtf.file import FileField,FileAllowed,FileRequired
class UploadForm(Form):
avatar = FileField(validators=[FileAllowed(['png','jpg','jpeg']),FileRequired()])
desc = StringField(validators=[Required()])
@app.route('/upload/',methods=['GET','POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
else:
form = UploadForm(CombinedMultiDict([request.form,request.files]))
if form.validate():
desc = form.desc.data
file = request.files.get('avatar')
# file.save(dst=secure_filename(file.filename))
Flask-WTF的更多相关文章
- Flask - WTF和WTForms创建表单
目录 Flask - WTF和WTForms创建表单 一. Flask-WTF 1.创建基础表单 2.CSRF保护 3.验证表单 4.文件上传 5.验证码 二. WTForms 1. field字段 ...
- 【Flask】 结合wtforms的文件上传表单
表单中的文件上传 基本的表单渲染,表单类设置等等就不多说了,参看另一个文章即可.但是那篇文章里没有提到对于FileField,也就是上传文件的表单字段是如何处理,后端又是如何实现接受上传过来的文件的. ...
- Flask 入门(第一篇)
1. 认识 Flask Flask 是一个微型 Web 框架,依赖于 jinjia2 模板系统和 Werkzeug WSGI(本质为 Socket 服务端) 服务,默认情况不支持数据库抽象层.表单验证 ...
- 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
目录 目录 前文列表 WTForms WTF 的基础使用 常用的字段类型 fieldsDateField fieldsIntegerField fieldsFloatField fieldsStrin ...
- flask修改flask_wtf使其支持json数据的validation验证
flask默认是前后端不分离策略,前端通过flask+wtf表单来传递post,put...等数据. 现在前后端分离是趋势,那么对flask进行一定的修改,变为前后端分离,在前端页面中请求后端,那么请 ...
- Flask Jinja2 知识点
Jinja2模板引擎使用以下分隔符从HTML转义. {% ... %}用于语句 {{ ... }}用于表达式可以打印到模板输出 {# ... #}用于未包含在模板输出中的注释 # ... ##用于行语 ...
- python flask框架详解
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pi ...
- 不管你是否已经准备面试, 这45道Python面试题都对你非常有帮助!(mark!)
1)什么是Python?使用Python有什么好处? Python是一种编程语言,包含对象,模块,线程,异常和自动内存管理.蟒蛇的好处在于它简单易用,可移植,可扩展,内置数据结构,并且它是一个开源的. ...
- Python面试应急5分钟!
不论你是初入江湖,还是江湖老手,只要你想给自己一个定位那就少不了面试!面试的重要性相信大家都知道把,这就是我们常说的“第一印象”,给大家说一下我的面试心得把,面试前的紧张是要的,因为这能让你充分准 ...
- python 全栈之路
目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...
随机推荐
- js中定时器相关
每三秒(3000 毫秒)弹出 "Hello" : setInterval(function(){ alert("Hello"); }, 3000); setIn ...
- tomat修改启动路径
https://blog.csdn.net/axela30w/article/details/76546735
- CHAPITRE II
J'ai ainsi vécu seul, sans personne avec qui parler véritablement, jusqu'à une panne[pan][机]故障 dans ...
- .Net实现Windows服务安装完成后自动启动的两种方法
考虑到部署方便,我们一般都会将C#写的Windows服务制作成安装包.在服务安装完成以后,第一次还需要手动启动服务,这样非常不方便. 方法一:在安装完成事件里面调用命令行的方式启动服务 此操作之前要先 ...
- 第12章:MongoDB-CRUD操作--文档--查询--游标详解
①是什么游标 游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口. 客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量. ...
- 如何制作chm文件
本文介绍如何从一个包中的docs文档生成一个chm文档. 1,准备软件Easy CHM 这个网上有下载,下载后安装,至于怎么使用,等下再介绍.安装之后如下图. 2,准备文件 比如我这里下载了一个cxf ...
- 不同数据源之间的数据同步jdbc解决方案
最近项目中用到的数据要从一个数据源获取存进另一个数据源,简单的jdbc解决方案. package com.sh.ideal.test.syns; import java.sql.Connection; ...
- hadoop yarn组件介绍
Yarn的产生 mapReduc1.0 1单点故障 2扩展效率低 3资源利用率高 降低运维成本 方便数据共享 多计算框架支持 MapReduce Spark Storm Yarn的架构图 Yarn模块 ...
- Windows 下 Quartus 检测不到 USB-Blaster 终极解决办法
转自https://blog.csdn.net/acang301/article/details/50471067?locationNum=12 一.Windows无法正常驱动USB-Blaster ...
- 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
好文原文地址:http://segmentfault.com/a/1190000000354555 本文将首先介绍grunt-markdown插件如何配合HTML模板使用,接着我将介绍如何使用grun ...