Flask:web表單

客戶端發送的全部經過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.

相關文章
相關標籤/搜索