web表單是web應(yīng)用中最基本的構(gòu)建要素,我們將通過表單來實(shí)現(xiàn)用戶發(fā)帖和應(yīng)用登錄功能。
創(chuàng)建config.py:
CSRF_ENABLED = True #吊圾。CSRF_ENABLED配置啟用了[跨站請求攻擊保護(hù)]谭溉,大部分情況下你都需要開啟此功能粥惧,這能使你的應(yīng)用更安全喘鸟。
SECRET_KEY = 'you-will-never-guess' #SECRET_KEY設(shè)置當(dāng)CSRF啟用時有效匆绣,這將生成一個加密的token供表單驗(yàn)證使用,你要確保這個KEY足夠復(fù)雜不會被簡單推測迷守。
用戶登錄表單
使用Flask-WTF創(chuàng)建的表單就像一個對象犬绒,需要從Form類繼承子類。然后在這個子類中定義一些類的屬性變量作為表單字段就可以了兑凿。
表單模板
<!-- extend from base layout -->
{% extends "base.html" %}
{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{form.hidden_tag()}}
<p>
Please enter your OpenID:<br>
{{form.openid(size=80)}}<br>
</p>
<p>{{form.remember_me}} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
它使用模板參數(shù) {{ ... }} 來實(shí)例化表單字段凯力,而表單字段又來源于我們剛剛定義的表單類,模板參數(shù)中使用了 form 這個名稱礼华。當(dāng)我們使用視圖函數(shù)引用表單類并渲染到模板時咐鹤,我們要特別注意這個把表單類傳遞到模板的變量名。
我們在配置中開啟了CSRF(跨站偽造請求)功能圣絮,模板參數(shù) {{ form.hidden_tag() }} 會被替換成一個具有防止CSRF功能的隱藏表單字段祈惶。在開啟了CSRF功能后,所有模板的表單中都需要添加這個模板參數(shù)扮匠。
表單視圖
from flask import render_template, flash, redirect
from app import app
from forms import LoginForm
# index view function suppressed for brevity
@app.route('/login', methods = ['GET', 'POST'])
def login():
form = LoginForm()
return render_template('login.html',
title = 'Sign In',
form = form)
我們引入登錄表單類捧请,然后把它實(shí)例化到一個變量,最后再把這個變量傳給模板棒搜。
從表單中接收數(shù)據(jù)
下面就是我們這個登錄視圖函數(shù)的新版本, 加入了表單數(shù)據(jù)驗(yàn)證和處理 疹蛉。下面就是我們這個登錄視圖函數(shù)的新版本, 加入了表單數(shù)據(jù)驗(yàn)證和處理:
@app.route('/login', methods = ['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data))
return redirect('/index')
return render_template('login.html',
title = 'Sign In',
form = form)
validate_on_submit() 這個方法做了表單處理的所有工作。如果你在表單向用戶提供數(shù)據(jù)時(舉個栗子:用戶在它之前修改了一下提交的數(shù)據(jù)) 時調(diào)用此方法力麸,它會返回 False可款。
當(dāng) validate_on_submit() 方法返回 True 的時候,我們的視圖函數(shù)又會調(diào)用兩個新的函數(shù)克蚂。它們都是從Flask 中引入的闺鲸,flash 函數(shù)用來在下一個打開的頁面中顯示定義的消息。我們現(xiàn)在用它用來做調(diào)試埃叭。因?yàn)槲覀儸F(xiàn)在還沒有做用戶登錄模塊摸恍, 所以只需要把用戶提交上來的數(shù)據(jù)顯示一下就行了。flash 函數(shù)非常有用赤屋,比如為用戶的一些操作提供消息反饋立镶。
flash 函數(shù)提供的消息不會自動出現(xiàn)在我們的網(wǎng)站頁面中,所以我們需要做點(diǎn)事情讓它在頁面中顯示出來益缎。為了讓我們所有頁面都能有這項(xiàng)激動人心的功能谜慌,所以就把它添加到基礎(chǔ)模板中吧, 下面是更新后的基礎(chǔ)模板 :
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>