客戶端發送的全部經過POST發出的請求信息均可以經過request.form獲取.可是若是咱們要生成表單的HTML代碼和驗證提交的表單數據那麼就須要採用另外的方法.Flask-WTF擴展能夠把處理web表單的過程變得更簡單.html
Flask-WTF能保護全部表單免受CSRF的攻擊.至於CSRF的原理參考http://www.cnblogs.com/zhanghongfeng/p/7787499.html這個帖子.爲了實現CSTF保護,Flask_WTF須要程序設置一個密鑰.Flask-WTF用這個密鑰生成加密令牌,在用令牌驗證請求中表單數據的真僞.設置密鑰的方法以下:web
import osflask
app.config['SECRET_KEY']=os.urandom(20)瀏覽器
下面咱們來看下錶單類.首先來看下完整的代碼:服務器
from flask_wtf import Form,FlaskFormsession
from wtforms import StringField,SubmitFieldapp
from wtforms.validators import Requireddom
class NameForm(FlaskForm):ide
name=StringField('what is your name?',validators=[Required()])函數
submit=SubmitField('Submit')
@app.route('/',methods=['GET','POST'])
def hello_world():
name=None
form=NameForm()
if form.validate_on_submit():
name=form.name.data
form.name.data=''
return render_template('index1.html',form=form,name=name)
index1的HTML代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>flask test</title>
</head>
<body>
{{ name }}
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }}{{ form.name(id='my-text-field') }}
{{ form.submit() }}
</form>
</body>
</html>
當咱們訪問http://192.168.0.12:8000/的時候,網頁顯示以下
當咱們在輸入框中輸入信息則顯示出咱們輸入的信息
接下來咱們就來看下代碼是如何運行的.首先咱們定義了一個表單類,每一個表單類都繼承自
FlaskForm.這個表單類中包含一個文本字段和一個提交按鈕.
WTForms中支持的HTML標準字段以下
字段類型 說 明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密碼文本字段
HiddenField 隱藏文本字段
DateField 文本字段,值爲 datetime.date 格式
DateTimeField 文本字段,值爲 datetime.datetime 格式
IntegerField 文本字段,值爲整數
DecimalField 文本字段,值爲 decimal.Decimal
FloatField 文本字段,值爲浮點數
BooleanField 複選框,值爲 True 和 False
RadioField 一組單選框
SelectField 下拉列表
SelectMultipleField 下拉列表,可選擇多個值
FileField 文件上傳字段
SubmitField 表單提交按鈕
FormField 把表單做爲字段嵌入另外一個表單
FieldList 一組指定類型的字段
再來看下視圖函數.app.route修飾器中添加的methods參數告訴Flask在URL映射中把這個視圖函數註冊爲GET和POST請求的處理程序,不然沒有methods參數,將只把視圖函數註冊爲GET請求的處理程序.
用戶第一次訪問程序的時候,服務器會收到一個沒有表單數據的GET請求.因此validate_on_submit將返回Flase.經過渲染模板處理請求,用戶會看到瀏覽器中顯示一個表單
用戶提交表單後,服務器收到一個包含數據的POST請求,valide_on_submit()會調用name字段上附屬的Required函數,若是名字不爲空,就能經過驗證.valide_on_submit返回True.並將名字賦值給局部變量name.最終在頁面上被渲染出來
重定向和用戶會話
前面的這個表單程序,當咱們輸入了用戶名而且再一次刷新index的頁面的時候,以前的信息已經不存在,又回到了表單提交的頁面.也就說以前的用戶會話沒有保存下來,因此刷新後找不到以前的用戶.那麼要保存用戶會話就要用到以前介紹的session會話
代碼修改以下:
from flask import Flask,render_template,session,redirect,url_for
@app.route('/',methods=['GET','POST'])
def hello_world():
form=NameForm()
if form.validate_on_submit():
session['name']=form.name.data
return redirect(url_for('hello_world'))
print session.get('name')
return render_template('index1.html',form=form,name=session.get('name'))
首先將name的值賦值給session[‘name’] 而後進行重定向.這裏重定向使用的是redirect函數,這裏重定向使用的是redirect(url_for('hello_world')).url_for(‘hello_world’)將生成對應的URL也就是’/’.這種使用方式的好處是保證URL和定義的路由兼容.url_for函數的第一個必須指定的參數名是端點名,即路由的內部名字.默認狀況下,路由的端點是相應視圖函數的名字,好比這裏傳入的是hello_world函數名
固然也能夠簡單點經過redirect(‘/’)的方式直接指定URL.