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

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


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

# -*- coding: UTF-8 -*-

from flask import Flask,render_template, session, redirect, url_for,flash
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from datetime import datetime
from flask_wtf import Form
from wtforms import StringField, SubmitField
from 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() }}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {{ wtf.quick_form(form) }}
{% endblock %}

详细解读py文件:

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

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

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

2.表单类

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

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

[python][Flask] 使用WTF处理表单_第1张图片


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

[python][Flask] 使用WTF处理表单_第2张图片

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) }}



你可能感兴趣的:(python)