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:渲染出来的是一个passwordinput标签。

  • 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的更多相关文章

  1. Flask - WTF和WTForms创建表单

    目录 Flask - WTF和WTForms创建表单 一. Flask-WTF 1.创建基础表单 2.CSRF保护 3.验证表单 4.文件上传 5.验证码 二. WTForms 1. field字段 ...

  2. 【Flask】 结合wtforms的文件上传表单

    表单中的文件上传 基本的表单渲染,表单类设置等等就不多说了,参看另一个文章即可.但是那篇文章里没有提到对于FileField,也就是上传文件的表单字段是如何处理,后端又是如何实现接受上传过来的文件的. ...

  3. Flask 入门(第一篇)

    1. 认识 Flask Flask 是一个微型 Web 框架,依赖于 jinjia2 模板系统和 Werkzeug WSGI(本质为 Socket 服务端) 服务,默认情况不支持数据库抽象层.表单验证 ...

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

    目录 目录 前文列表 WTForms WTF 的基础使用 常用的字段类型 fieldsDateField fieldsIntegerField fieldsFloatField fieldsStrin ...

  5. flask修改flask_wtf使其支持json数据的validation验证

    flask默认是前后端不分离策略,前端通过flask+wtf表单来传递post,put...等数据. 现在前后端分离是趋势,那么对flask进行一定的修改,变为前后端分离,在前端页面中请求后端,那么请 ...

  6. Flask Jinja2 知识点

    Jinja2模板引擎使用以下分隔符从HTML转义. {% ... %}用于语句 {{ ... }}用于表达式可以打印到模板输出 {# ... #}用于未包含在模板输出中的注释 # ... ##用于行语 ...

  7. python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pi ...

  8. 不管你是否已经准备面试, 这45道Python面试题都对你非常有帮助!(mark!)

    1)什么是Python?使用Python有什么好处? Python是一种编程语言,包含对象,模块,线程,异常和自动内存管理.蟒蛇的好处在于它简单易用,可移植,可扩展,内置数据结构,并且它是一个开源的. ...

  9. Python面试应急5分钟!

    ​ 不论你是初入江湖,还是江湖老手,只要你想给自己一个定位那就少不了面试!面试的重要性相信大家都知道把,这就是我们常说的“第一印象”,给大家说一下我的面试心得把,面试前的紧张是要的,因为这能让你充分准 ...

  10. python 全栈之路

    目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...

随机推荐

  1. 纯css实现网络图标

    <html> <head> <title>css图标</title> <meta charset="utf-8"> &l ...

  2. c#用EPPLUS操作excel

    参考: http://www.cnblogs.com/rumeng/p/3785748.html http://www.cnblogs.com/libla/p/5824296.html#3818995 ...

  3. 将excel中的数据填入word模板中-VBA

    首先将word模板中需要填写excel中数据的空白处用自己独特的字符串标记,比如   数据001  什么的.如下图: 这样,就可以用vba搜寻这些自己独特的标记来根据excel内容填充word了. 第 ...

  4. altera FIFO知识点

    虽然是很常用的IP,但经常用时还要看下文档,某些知识点如果能记住的话,还是可以节省很多时间的.   (1)输入输出位宽不相等 这里以输入16位数据输出为8位数据为例,写入两16位的数据,读出4个8位的 ...

  5. MySQL RR模式下如何加锁

    锁的算法有三种,如下: record lock.gap lock.next_key lock 在不同的隔离级别下,所使用的锁的算法如下: RC:仅有record 锁 RR:有record和next_k ...

  6. crontab使用环境变量

    两种方式: 1)直接在crontab中定义变量,如: A=123 * * * * * echo $A > /tmp/a.txt 注意在定义变量时不能使用$引用其它变量,如下面的做法错误: A=1 ...

  7. Docker mysql 主从

    一.独立容器部署mysql主从 # 主从 my.cnf加上 [mysqld] server-id = XXX log-bin = mysql-bin log-bin-index = log-bin.i ...

  8. 2018/02/25 PendingIntent使用

    https://www.cnblogs.com/liyiran/p/4656821.html http://blog.csdn.net/ydpl2007/article/details/7591642 ...

  9. 20145232 韩文浩 《Java程序设计》第9周学习总结

    教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会使用标准注解 JDBC标准主要分为两个部分:JDBC应用程序开发者接口和 ...

  10. (动规 或 最短路)Help Jimmy(poj 1661)

    http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的 ...