摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個參數(shù)是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。
第二章中介紹的request對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。
盡管Flask的request對象提供的支持足以處理web表單,但依然有許多任務(wù)會變得單調(diào)且重復(fù)。表單的HTML代碼生成和驗證提交的表單數(shù)據(jù)就是兩個很好的例子。
Flask-WTF擴展使得處理web表單能獲得更愉快的體驗。該擴展是一個封裝了與框架無關(guān)的WTForms包的Flask集成。
Flask-WTF和它的依賴集可以通過pip來安裝:
(venv) $ pip install flask-wtf1、跨站請求偽造(CSRF)保護
默認(rèn)情況下,F(xiàn)lask-WTF保護各種形式對跨站請求偽造(CSRF)攻擊。一個CSRF攻擊發(fā)生在一個惡意網(wǎng)站發(fā)送請求給受害者登錄的其他網(wǎng)站。
為了實現(xiàn)CSRF保護,F(xiàn)lask-WTF需要應(yīng)用程序去配置一個加密密鑰。Flask-WTF使用這個密鑰去生成加密令牌用于驗證請求表單數(shù)據(jù)的真實性。示例4-1展示如何配置加密密鑰。
示例4-1. hello.py:Flask-WTF配置
app = Flask(__name__) app.config["SECRET_KEY"] = "hard to guess string"
app.config字典通常是框架、擴展或應(yīng)用程序自身存放配置變量的地方,可以使用標(biāo)準(zhǔn)字典語法添加配置值到app.config中。配置對象提供方法來從文件或環(huán)境導(dǎo)入配置值。
SECRET_KEY配置變量作為Flask和一些第三方擴展的通用加密密鑰。加密的強度取決于這個變量的值。給你構(gòu)建的每個應(yīng)用程序選擇不同的密鑰,并確保這個字符串不被其他任何人知道。
2、表單類注:為了提高安全性,密鑰應(yīng)該存儲在一個環(huán)境變量中,而不是嵌入到代碼中。這個會在第7章中描述。
使用Flask-WTF時,每個web表單是由繼承自Form類的子類來展現(xiàn)的。該類在表單中定義了一組表單域,每個都表示為一個對象。每個表單域都可以連接到一個或多個validators;validators是一個用于檢查用戶提交的輸入是否合法的函數(shù)。
示例4-2展示了一個擁有文本框和提交按鈕的簡單web表單。
示例4-2. hello.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"屬性的標(biāo)簽。SubmitField類表示一個type="submit"屬性的標(biāo)簽。表單域構(gòu)造函數(shù)的第一個參數(shù)是一個label,在渲染表單到HTML時會使用。
StringField構(gòu)造函數(shù)包含可選參數(shù)validators,它定義了一組檢查來驗證用戶提交的數(shù)據(jù)。Required()驗證確保提交的表單域不為空。
注:Flask-WTF擴展定義了表單基類,所以它從flask.ext.wtf導(dǎo)入。表單域、驗證都是直接從WTForms包中導(dǎo)入。
表格4-1展示了一組WTForms支持的標(biāo)準(zhǔn)表單域。
表格4-1. WTForms標(biāo)準(zhǔn)HTML表單域
表格4-2展示了一組WTForms內(nèi)建驗證。
表格4-2. WTForms驗證
3、HTML渲染的表單表單域是可調(diào)用的,調(diào)用時從模板渲染它們到HTML。假設(shè)視圖函數(shù)傳遞一個參數(shù)名為form的NameForm實例給模板,模板就會生成一個簡單的HTML表單,如下所示:
當(dāng)然,結(jié)果是什么都沒有。為了改變表單的外觀顯示,任何發(fā)送給該表單域的參數(shù)會被轉(zhuǎn)換為HTML表單域?qū)傩?;例如,你可以給定表單域id或class屬性,然后定義CSS樣式:
即使有HTML屬性,努力用這種方式渲染表單是非常重要的,所以最好是盡可能的使用Bootstrap自帶的一系列表單樣式。Flask-Bootstrap使用Bootstrap的預(yù)定義表單樣式來提供高級的幫助函數(shù)來渲染整個Flask-WTF表單,這些操作都只需要一個調(diào)用即可完成。使用Flask-Bootstrap,上一個表單可以像下面這樣來渲染:
{% import "bootstrap/wtf.html" as wtf %} {{ wtf.quick_form(form) }}
import指令和常規(guī)的Python腳本一樣的作用并且允許模板元素被導(dǎo)入并在許多模板中使用。被導(dǎo)入的bootstrap/wtf.html文件,定義了幫助函數(shù)使用Bootstrap來渲染Flask-WTF表單。wtf.quick_form()函數(shù)傳入Flask-WTF表單對象并使用默認(rèn)Bootstrap樣式渲染它。示例4-3展示了完整的hello.py模板。
示例4-3. templates/index.html:使用Flask-WTF和Flask-Bootstrap渲染表單
{% extends "base.html" %} {% import "bootstrap/wtf.html" as wtf %} {% block title %}Flasky{% endblock %} {% block page_content %}{{ wtf.quick_form(form) }} {% endblock %}Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!
目前模板的內(nèi)容區(qū)有兩塊。第一塊是類為page-header的div輸出一個問候語。這里使用了模板條件判斷語句。在Jinja2中格式為{% if variable %}...{% else %}...{% endif %}。如果判斷條件為True則渲染if和else之間的內(nèi)容。如果判斷條件為False則渲染else和endif之間的內(nèi)容。示例模板會渲染字符串“Hello, Stranger!”當(dāng)name模板參數(shù)未定義的時候。第二塊內(nèi)容使用wtf.quick_form()函數(shù)渲染NameForm對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37454.html
摘要:局部變量用于保存從表單中接收到的名字,初始化時變量為。在語句中,這個名字被賦值給局部變量且表單域的數(shù)據(jù)屬性通過賦值為空字符串而被清除。示例重定向和用戶會話在上一個版本中,局部變量用于保存用戶在表單中輸入的姓名。 4、視圖函數(shù)中的表單操作 在新版本的hello.py中,index()視圖函數(shù)渲染表單并接收其數(shù)據(jù)。示例4-4展示更新后的index()視圖函數(shù)。 示例4-4. hello...
摘要:用真實的值替換變量并返回最終響應(yīng)字符串,這個過程稱為渲染。示例展示模板實現(xiàn)該響應(yīng)??刂平Y(jié)構(gòu)提供一些控制結(jié)構(gòu)用于改變模板流。這個示例展示如何使用循環(huán)做到這些同樣支持宏,這和代碼中的函數(shù)很像。 寫代碼最關(guān)鍵的是要易于維護且結(jié)構(gòu)清晰整潔。目前為止,你看到的例子都過于簡單從而沒有做這方面的要求。Flask視圖函數(shù)希望將兩個應(yīng)該完全獨立的任務(wù)一并處理,兩個任務(wù)有兩種代碼,一并處理勢必會引發(fā)問題。...
摘要:函數(shù)攜帶目的地址主題郵件體模板和一組關(guān)鍵字參數(shù)。許多擴展操作是在假設(shè)有活動的應(yīng)用程序和請求上下文的情況下進行的。但是當(dāng)函數(shù)在一個不同的線程上執(zhí)行,應(yīng)用程序上下文需要人為地創(chuàng)建使用。例如,執(zhí)行函數(shù)可以將郵件發(fā)送到的任務(wù)隊列中。 許多類型的應(yīng)用程序都會在某些事件發(fā)生的時候通知用戶,常用的溝通方法就是電子郵件。盡管在Flask應(yīng)用程序中,可以使用Python標(biāo)準(zhǔn)庫中的smtplib包來發(fā)送電...
摘要:如果路由重組,模板中的鏈接將被打斷而變得無法訪問。靜態(tài)文件應(yīng)用程序不僅僅是由代碼和模板組成。當(dāng)服務(wù)器收到來自之前示例的,它會產(chǎn)生一個響應(yīng)包含的文件內(nèi)容。一個優(yōu)雅的解決方案是允許服務(wù)器只發(fā)送時間給瀏覽器,由瀏覽器轉(zhuǎn)為當(dāng)?shù)貢r間并渲染。 4、鏈接 任何應(yīng)用程序都有多個路由,必然需要包含鏈接來連接不同的頁面,例如導(dǎo)航欄。 在模板中,對于簡單的路由直接寫URLs做鏈接是非?,嵥槁闊┑模o帶...
摘要:有兩類應(yīng)用級和請求級。一個響應(yīng)中非常重要的部分是狀態(tài)碼,默認(rèn)設(shè)置來指示請求已經(jīng)成功處理。重定向通常由響應(yīng)狀態(tài)碼注明并且重定向的由頭部的給出。因為這些變化,應(yīng)用程序獲得一組基本的命令行選項。運行顯示可用信息在應(yīng)用程序上下文的內(nèi)部運行一個。 5、請求-響應(yīng)循環(huán) 現(xiàn)在你已經(jīng)玩過一個基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計方面的特點。...
閱讀 920·2019-08-30 15:54
閱讀 1481·2019-08-30 15:54
閱讀 2409·2019-08-29 16:25
閱讀 1303·2019-08-29 15:24
閱讀 756·2019-08-29 12:11
閱讀 2513·2019-08-26 10:43
閱讀 1238·2019-08-26 10:40
閱讀 478·2019-08-23 16:24