+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-06(3)

2019-07(5)

2019-08(103)

2019-09(107)

2019-10(11)

Flask笔记:WTForms

发布于2019-12-07 22:52     阅读(584)     评论(0)     点赞(28)     收藏(3)


使用Flask-WTF处理表单

WTForms 是一个使用 Python 编写的表单库, 它使得表单的定义、验证(服务器端) 和处理变得非常轻松。Flask-WTF 集成了 WTForms,使用它可以在 Flask 中更方便地使用 WTForms。Flask-WTF 集成了表单数据解析、CSRF保护、文件上传等功能。

1. 安装

	pip install flask-wtf
  • 1

Flask-WTF使用程序密钥来对CSRF令牌进行签名,所以需要为程序设置密钥:

	app.secret key =’secret string’ 
  • 1

2. 创建表单类

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()], render_kw={"placeholder":"hello"})
    password = PasswordField('Password', validators=[DataRequired(), Length(8,128)])
    submit = SubmitField('Login')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

每个表单类必须继承自FlaskForm, 其中StringField等为表单中具体的字段,每个字段常用参数如下:

参 数 说 明
label 字段标签<label>的值,也就是渲染后显示在输入字段前的文字
render_kw 一个字典,用来设置对应的 HTML <input> 标签的属性,比如传入{'placeholder' : 'Your Name'},渲染后的 HTML 代码会将 <input> 标签的 placeholder 属性设为 Your Name
validators 一个列表,包含一系列验证器,会在表单提交后被逐一调用验证表单数据
default 字符串或可调用对象,用来为表单字段设置默认值

3. 在模板中渲染表单

3.1 传入表单实例
from forms import LoginForm

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    # form.validate()用来验证用户输入的数据是否符合之前validators中给出的要求
    # 也可用 form.validate_on_submit()代替下面的条件
    if request.method == 'POST' and form.validate():
        ... # 处理POST请求
    return render_template('login.html', form=form)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

除了 POST 方法,如果请求的方法是 PUT、 PATCH 和 DELETE 方法, form.validate_on_ submit()也会验证表单数据。在这里不用带心会相应PUT方法,因为在methods中规定了只响应GET和POST方法。

3.2 在模板中渲染表单
<form method="post"> 
    {{ form.csrf_token }} <!-- CSRF令牌隐藏字段 -->

     {{ form.username.label }} 
     {{ form.username(class="form-control") }}  <!--可传入关键字参数-->

     {% for message in form.username.errors %} <!--服务器端验证后的错误信息-->
     <small class="error">{{ message }} </small><br> 
     {% endfor %}

     {{ form.password.label }} 
     {{ form.password(class="form-control", placeholder="hello") }} 

    {{ form.submit(class="btn btn-primary") }} 
</form>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

附:常用WTForms字段

字段类 说明 对应的HTML表示
BooleanField 复选框,值会被处理为 True 或 False <input type="checkbox">
DateField 文本字段,值会被处理为 datetime.date 对象 <input type="text">
DateTimeField 文本字段,值会被处理为 datetime.datetime 对象 <input type="text">
FileField 文件上传字段 <input type="file">
FloatField 浮点数字段,值会被处理为浮点型 <input type="text">
IntegerField 整数字段,值会被处理为整型 <input type="text">
RadioField 一组单选按钮 <input type="radio">
SelectField 下拉列表 <select><option></option></select>
SelectMultipleField 多选下拉列表 <select multiple><option></option></select>
SubmitField 提交按钮 <input type="submit">
StringField 文本字段 <input type="text">
HiddenField 隐藏文本字段 <input type="hidden">
PasswordField 密码文本字段 <input type="password">
TextAreaField 多行文本字段 <textarea></textarea>

常用的 WTForms 验证器

验证器 说 明
DataRequired(message=None) 验证数据是否有效
Email(message=None) 验证 Email 地址
EqualTo(fieldname, message=None) 验证两个字段值是否相同
InputRequired(message=None) 验证是否有数据
Length(min=-1 , max=-l, message=None) 验证输入值长度是否在给定范围内
NumberRange(min=None, max=None, message=None) 验证输入数字是否在给定范围内
Optional(strip_whitespace=True) 允许输入值为空 , 并跳过其他验证
Regexp(regex, flags=O, message=None) 使用正则表达式验证输入值
URL(require_tld=True, message=None) 验证 URL
AnyOf(values, message=None, values_formatter=None) 确保输入值在可选值列表中
NoneOf(values, message=None, values_formatter=None) 确保输入值不在可选值列表中

在实例化验证类时, message参数用来传入自定义错误消息,如果没有设直则使用内置的英文错误消息

详见《Flask Web开发实战》



所属网站分类: 技术文章 > 博客

作者:jiem

链接: https://www.pythonheidong.com/blog/article/170253/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)