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