1 配置
可以使用Flask-WTF來處理web表單,在使用之前要先配置下,打開config.py,編輯添加如下內容
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
WTF_CSRF_ENABLED設置為True主要是開啟CSRF保護,SECRET_KEY是為了實現CSRF保護,Flask-WTF需要應用程序去配置一個加密密鑰。Flask-WTF使用這個密鑰去生成加密令牌用於驗證請求表單數據的真實性,注:為了提高安全性,密鑰應該存儲在一個環境變量中,而不是嵌入到代碼中。配置完成后要通知Flask去加載這個配置文件,編輯app/__init__.py,添加如下內容
from flask import Flask
app = Flask(__name__) app.config.from_object('config')
from app import views
2 表單類
使用Flask-WTF時,每個web表單是由繼承自 Form 類的子類來展現的。該類在表單中定義了一組表單域,每個都表示為一個對象。每個表單域都可以連接到一個或多個 validators ; validators 是一個用於檢查用戶提交的輸入是否合法的函數,app/forms.py 專門用來存放表單類,用例
from flask.ext.wtf import Form from wtforms import StringField, SubmitField from wtforms.validators import Required class NameForm(Form): name = StringField('What is your name?', validators=[Required()]) submit = SubmitField('Submit')
示例中, NameForm
表單有一個 name
文本框和 submit
提交按鈕。 StringField
類表示一個 type="text"
屬性的 <input>
標簽。 SubmitField
類表示一個 type="submit"
屬性的 <input>
標簽。表單域構造函數的第一個參數是一個 label
,在渲染表單到HTML時會使用。StringField
構造函數包含可選參數 validators
,它定義了一組檢查來驗證用戶提交的數據。 Required()
驗證確保提交的表單域不為空
WTForms標准HTML表單域
WTForms驗證
3 表單渲染模版
假設視圖函數傳遞一個參數名為 form
的NameForm
實例給模板,模板就會生成一個簡單的HTML表單,如下所示:假設名字為nameform.html
<form method="POST"> { { form.name.label }} { { form.name() }} { { form.submit() }} </form>
當然,結果是什么都沒有。為了改變表單的外觀顯示,任何發送給該表單域的參數會被轉換為HTML表單域屬性;例如,你可以給定表單域 id
或 class
屬性,然后定義CSS樣式:即使有HTML屬性,努力用這種方式渲染表單是非常重要的,所以最好是盡可能的使用Bootstrap自帶的一系列表單樣式。Flask-Bootstrap使用Bootstrap的預定義表單樣式來提供高級的幫助函數來渲染整個Flask-WTF表單,這些操作都只需要一個調用即可完成
<form method="POST"> { { form.name.label }} { { form.name(id='my-text-field') }} { { form.submit() }} </form>
---完善 nameform.html
<!-- extend from base layout -->
{% extends "base.html" %}
{% block content %}
<h1>{{title}}</h1>
<form action="" method="post" name="nameform">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>
{% endblock %}
4 視圖函數使用表單
from .forms import NameForm
@app.route('/nameform', methods=['GET', 'POST'])
def nameform():
form = NameForm()
"""
處理接收表格數據,Flask-WTF讓這個工作變得簡單,validate_on_submit
處理了所有表格的基本工作,只需要判斷然后直接引用數據即可
調用validate_on_submit時,這個函數會嘗試接收用戶提交的所有數據,然后做下表格校驗,
如果一切校驗都通過,意味着數據可以被合法安全處理,如果校驗不通過會直接刷新停在原來頁面
那如何做錯誤信息提示呢?
"""
if form.validate_on_submit():
flash('%s' %(form.name.data))
return redirect('/index')
return render_template('nameform.html',
title='nameform',
form=form)
效果

5 出錯提醒
name再加個校驗器,需要輸入最少6個字符,最多35個字符
class NameForm(Form): name = StringField('What is your name?', validators=[Required(), validators.Length(min=6, max=35)]) submit = SubmitField('Submit')
點擊無反應,我們希望是能提示用戶錯誤信息,在哪里加,在渲染的html模版里面,錯誤信息會存放到form.FieldName.errors里面,改進渲染模版
<!-- extend from base layout -->
{% extends "base.html" %}
{% block content %}
<h1>{{title}}</h1>
<form action="" method="post" name="nameform">
{{ form.hidden_tag() }}
<p>
{{ form.name.label }} {{ form.name() }}
{% for error in form.name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.submit() }}
</p>
</form>
{% endblock %}