[python][Flask] 使用WTF处理表单

来源:互联网 发布:新娘梦工厂提取数据 编辑:程序博客网 时间:2024/06/06 00:59

Flask-WTF(http://pythonhosted.org/Flask-WTF/)扩展可以把处理Web 表单的过程变成一种愉悦的体验。


以下演示一个简单的Web表单,包含一个文本字段和一个提交按钮:

# -*- coding: UTF-8 -*-from flask import Flask,render_template, session, redirect, url_for,flashfrom flask_bootstrap import Bootstrapfrom flask_moment import Momentfrom datetime import datetimefrom flask_wtf import Formfrom wtforms import StringField, SubmitFieldfrom wtforms.validators import Required#创建moment和bootstrap实例app=Flask(__name__)moment=Moment(app)bootstrap=Bootstrap(app)#实现CSFR保护app.config['SECRET_KEY'] = 'hard to guess string'#创建表单类class NameForm(Form):    #文本字段    name = StringField('What is your name?', validators=[Required()])    #提交按钮    submit = SubmitField('Submit')@app.route('/', methods=['GET', 'POST'])def hello_falsk():    #创建一个实例    form = NameForm()    if form.validate_on_submit():        #获取上下文中name的值        old_name = session.get('name')        if old_name is not None and old_name != form.name.data:            #flash消息            flash('Looks like you have changed your name!')        #从表单中获取name值        session['name'] = form.name.data        #重定向保证post不是最后一个方法        return redirect(url_for('hello_falsk'))    return render_template('mainpage_WTF.html',form=form, name=session.get('name'),current_time=datetime.utcnow())#-----------------------------------------------------------------------------------------------------------------------if __name__=='__main__':    app.run(debug=True)

mainpage_WTF.html内容如下:


{% extends "base.html" %}{% import "bootstrap/wtf.html" as wtf %}{% block title %}{{ super() }}{% endblock %}{% block navbar %}{{ super() }}{% endblock %}{% block content %}{{ super() }}{% endblock %}{% block scripts %}{{ super() }}<div class="container">    {% for message in get_flashed_messages() %}    <div class="alert alert-warning">        <button type="button" class="close" data-dismiss="alert">×</button>        {{ message }}    </div>    {% endfor %}    <div class="page-header">        <h3>            <p>The local date and time is {{ moment(current_time).format('LLL') }}.</p>            <p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>        </h3>        <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>    </div>    {{ wtf.quick_form(form) }}</div>{% endblock %}

详细解读py文件:

1.跨站请求伪造保护( CSRF )

为了实现CSRF保护,Flask-WTF程序需要设置一个密钥,方法如下:

app.config['SECRET_KEY'] = 'hard to guess string'

2.表单类

表单类有一个字段构造函数和一个提交按钮函数,其中字段构造函数StringField的第二个参数是validators可选参数,指定一个由验证函数组成的列表,在接受用户提交的数据之前验证数据。

以下是WTFForms支持的字段函数:



以下是WTFForms支持的验证函数:


3.视图函数

在视图函数中,我们首先创建了一个NameForm类实例。在提交表单之后,如果数据能被所有验证函数接受,那么validate_on_submit() 方法的返回值为True,否则返回False。

用户第一次访问程序时,服务器将收到一个没有表单数据的GET请求,因此validate_on_submit() 将返回False。

用户提交表单后,服务器会验证文本字段,如果满足Required()函数(文本字段不为空),则validate_on_submit() 将返回True。

此时可以通过session获取上下文的数据,将上下文中的name赋值给old_name,(如果是第一次提交,则上下文中的name为None)。

如果上下文中的name和用户此次提交的name不想等,则提示一个Flash消息。

return redirect(url_for('hello_falsk'))

redirect() 是个辅助函数,用来生成HTTP 重定向响应,保证post不是浏览器发送的最后一个请求。redirect() 函数的参数是重定向的URL,url_for() 函数的第一个且唯一必须指定的参数是端点名,即路由的内部名字。默认情况下,路由的端点是相应视图函数的名字。


4.将表单渲染成HTML

使用Flask-Bootstrap渲染表单,方式如下:

{% import "bootstrap/wtf.html" as wtf %}{{ wtf.quick_form(form) }}