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)
{% 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 %}
The local date and time is {{ moment(current_time).format('LLL') }}.
That was {{ moment(current_time).fromNow(refresh=True) }}
Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!
{{ wtf.quick_form(form) }}
{% endblock %}
1.跨站请求伪造保护( CSRF )
为了实现CSRF保护,Flask-WTF程序需要设置一个密钥,方法如下:
app.config['SECRET_KEY'] = 'hard to guess string'
表单类有一个字段构造函数和一个提交按钮函数,其中字段构造函数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'))
4.将表单渲染成HTML
使用Flask-Bootstrap渲染表单,方式如下:
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}