摘要:示例使用的模板的指令通過(guò)從引用來(lái)實(shí)現(xiàn)模板的繼承。上面的模板定義了三個(gè),分別命名為和。同時(shí)返回相應(yīng)錯(cuò)誤的數(shù)字狀態(tài)碼。示例帶有導(dǎo)航欄的基礎(chǔ)應(yīng)用程序模板這個(gè)模板中的塊中只是一個(gè)名為的元素,它包含了在派生模板中定義的名為的空。
2、集成Twitter Bootstrap的Flask-Bootstrap
Bootstrap是Twitter的一個(gè)開(kāi)源框架,提供用戶(hù)交互組件來(lái)創(chuàng)建一個(gè)清新且有吸引力的web頁(yè)面,并兼容所有現(xiàn)代web瀏覽器。
Bootstrap是一個(gè)客戶(hù)端框架,服務(wù)端不直接參與。服務(wù)端需要做的就是提供HTML響應(yīng),引用層疊樣式表(CSS)和JavaScript文件并通過(guò)HTML、CSS、和JavaScript代碼來(lái)實(shí)例化需要的組件。模板是做這些的理想地方。
集成Bootstrap到應(yīng)用程序最好的方式是在模板中做一些必要的改變。一個(gè)簡(jiǎn)單點(diǎn)的途徑就是使用Flask-Bootstrap擴(kuò)展去簡(jiǎn)化集成工作??梢酝ㄟ^(guò)pip來(lái)安裝Flask-Bootstrap:
(venv) $ pip install flask-bootstrap
Flask擴(kuò)展通常在應(yīng)用程序?qū)嵗粍?chuàng)建的時(shí)候初始化。示例3-4展示Flask-Bootstrap的初始化。
示例3-4. hello.py:Flask-Bootstrap初始化
from flask.ext.bootstrap import Bootstrap # ... bootstrap = Bootstrap(app)
和第二章的Flask-Script一樣,F(xiàn)lask-Bootstrap從flask.ext命名空間導(dǎo)入并通過(guò)傳遞應(yīng)用程序?qū)嵗綐?gòu)造函數(shù)來(lái)初始化。
一旦Flask-Bootstrap被初始化,一個(gè)包含所有Bootstrap文件的基礎(chǔ)模板就可供應(yīng)用程序使用了。這個(gè)模板利用Jinja2的模板繼承,應(yīng)用程序則可以擴(kuò)展一個(gè)擁有通用頁(yè)面結(jié)構(gòu),且包含Bootstrap導(dǎo)入的元素的基礎(chǔ)模板。示例3-5展示作為派生模板的新版user.html。
_示例3-5. templates/user.html: 使用Flask-Bootstrap的模板
{% extends "bootstrap/base.html" %} {% block title %}Flasky{% endblock %} {% block navbar %}{% endblock %} {% block content %}{% endblock %}Hello, {{ name }}!
Jinja2的extends指令通過(guò)從Flask-Bootstrap引用bootstrap/base.html來(lái)實(shí)現(xiàn)模板的繼承。Flask-Bootstrap的基礎(chǔ)模板提供一個(gè)包含Bootstrap CSS和JavaScript文件的web頁(yè)面骨架。
基礎(chǔ)模板定義了一些可以被派生模板重寫(xiě)的block。block和endblock指令定義了被添加到基礎(chǔ)模板中block的內(nèi)容。
上面的user.html模板定義了三個(gè)block,分別命名為title、navbar和content?;A(chǔ)模板里的這些block輸出派生模板定義的內(nèi)容。title塊比較簡(jiǎn)單;它的內(nèi)容將出現(xiàn)在
在這個(gè)模板中,navbar塊使用Bootstrap組件定義了一個(gè)簡(jiǎn)單的導(dǎo)航欄。content塊有個(gè)名為container的 建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 3b來(lái)切換到這個(gè)版本的應(yīng)用程序。Bootstrap官方文檔 是一個(gè)非常強(qiáng)大的學(xué)習(xí)資料,完全可以復(fù)制粘貼使用那些示例。 圖片3-1. Twitter Bootstrap模板 Flask-Bootstrap的base.html模板定義了一些其他可供派生模板使用的block。表格3-2展示了完整的可用block列表。 表格3-2. Flask-Bootstrap基礎(chǔ)模板中的block 表格3-2中的許多塊用于Flask-Bootstrap自身,所以直接重寫(xiě)它們會(huì)引發(fā)問(wèn)題。例如,styles和scripts塊是Bootstrap定義文件的地方。如果應(yīng)用程序需要新增自己的內(nèi)容到已經(jīng)有一些內(nèi)容的塊中,則必須使用Jinja2的super()。例如,如何在派生模板中寫(xiě)scripts塊,來(lái)給文檔增加新的JavaScript文件: 當(dāng)你輸入錯(cuò)誤路徑在你的瀏覽器地址欄,你會(huì)得到404錯(cuò)誤代碼頁(yè)面。目前的錯(cuò)誤頁(yè)面很普通也沒(méi)有吸引力,且沒(méi)有一致的使用Bootstrap頁(yè)面。 Flask允許應(yīng)用程序自定義基于模板的錯(cuò)誤頁(yè)面,就像常規(guī)的路由。兩個(gè)最常見(jiàn)的錯(cuò)誤代碼,404是在客戶(hù)端請(qǐng)求的頁(yè)面或路徑不存在的時(shí)候觸發(fā);500是當(dāng)存在未處理的異常時(shí)觸發(fā)。示例3-6展示如何為這兩個(gè)錯(cuò)誤提供自定義處理。 示例3-6. hello.py:自定義錯(cuò)誤頁(yè)面 錯(cuò)誤處理返回響應(yīng),和視圖函數(shù)一樣。同時(shí)返回相應(yīng)錯(cuò)誤的數(shù)字狀態(tài)碼。 在錯(cuò)誤處理中引用的模板需要自己去寫(xiě)。這些模板需要和常規(guī)的頁(yè)面一樣的布局,所以在這個(gè)示例中需要導(dǎo)航欄和頁(yè)面頭部顯示錯(cuò)誤信息。 編寫(xiě)這些模板的簡(jiǎn)單方式是復(fù)制templates/user.html到templates/404.html和templates/500.html,然后改變這兩個(gè)新文件的頁(yè)面頭部元素來(lái)給出相應(yīng)的錯(cuò)誤信息,但這會(huì)產(chǎn)生很多副本。 Jinja2的模板繼承可以幫助我們解決這個(gè)問(wèn)題。Flask-Bootstrap提供了一個(gè)帶有基本布局頁(yè)面的基礎(chǔ)模板,應(yīng)用程序可以定義自己的、帶有完整頁(yè)面布局的基礎(chǔ)模板,包括導(dǎo)航欄和定義在派生模板中的頁(yè)面內(nèi)容。示例3-7展示了templates/base.html,它是一個(gè)繼承自bootstrap/base.html的新模板且定義了導(dǎo)航欄,但對(duì)于其他模板則是一個(gè)基礎(chǔ)模板,例如templates/user.html、templates/404.html和templates/500.html。 _示例3-7. templates/base.html:帶有導(dǎo)航欄的基礎(chǔ)應(yīng)用程序模板 這個(gè)模板中的content塊中只是一個(gè)名為container的 應(yīng)用程序的模板將從該模板繼承而不是直接從Flask-Bootstrap繼承。示例3-8展示了從templates/base.html繼承來(lái)構(gòu)造一個(gè)自定義404錯(cuò)誤頁(yè)面是如此的簡(jiǎn)單。 示例3-8. templates/404.html:使用模板繼承自定義404錯(cuò)誤頁(yè)面 圖片3-2展示在瀏覽器中錯(cuò)誤頁(yè)面是怎樣的。 圖片3-2. 自定義404錯(cuò)誤頁(yè)面 現(xiàn)在templates/user.html模板可以通過(guò)繼承基礎(chǔ)模板來(lái)簡(jiǎn)化它,就像示例3-9展示的這樣。 示例3-9. templates/user.html:使用模板繼承簡(jiǎn)化頁(yè)面模板 建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 3c來(lái)切換到這個(gè)版本的應(yīng)用程序。 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37433.html 摘要:每個(gè)表單域都可以連接到一個(gè)或多個(gè)是一個(gè)用于檢查用戶(hù)提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個(gè)參數(shù)是一個(gè),在渲染表單到時(shí)會(huì)使用。驗(yàn)證確保提交的表單域不為空。表單域驗(yàn)證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。
第二章中介紹的request對(duì)象公開(kāi)了所有客戶(hù)端發(fā)送的請(qǐng)求信息。特別是request.form可以訪(fǎng)問(wèn)POST請(qǐng)求提交的表單數(shù)據(jù)。
盡管Flask的request... 摘要:如果路由重組,模板中的鏈接將被打斷而變得無(wú)法訪(fǎng)問(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做鏈接是非?,嵥槁闊┑模o帶... 摘要:用真實(shí)的值替換變量并返回最終響應(yīng)字符串,這個(gè)過(guò)程稱(chēng)為渲染。示例展示模板實(shí)現(xiàn)該響應(yīng)??刂平Y(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è)不同的線(xiàn)程上執(zhí)行,應(yīng)用程序上下文需要人為地創(chuàng)建使用。例如,執(zhí)行函數(shù)可以將郵件發(fā)送到的任務(wù)隊(duì)列中。
許多類(lèi)型的應(yīng)用程序都會(huì)在某些事件發(fā)生的時(shí)候通知用戶(hù),常用的溝通方法就是電子郵件。盡管在Flask應(yīng)用程序中,可以使用Python標(biāo)準(zhǔn)庫(kù)中的smtplib包來(lái)發(fā)送電... 摘要:局部變量用于保存從表單中接收到的名字,初始化時(shí)變量為。在語(yǔ)句中,這個(gè)名字被賦值給局部變量且表單域的數(shù)據(jù)屬性通過(guò)賦值為空字符串而被清除。示例重定向和用戶(hù)會(huì)話(huà)在上一個(gè)版本中,局部變量用于保存用戶(hù)在表單中輸入的姓名。
4、視圖函數(shù)中的表單操作
在新版本的hello.py中,index()視圖函數(shù)渲染表單并接收其數(shù)據(jù)。示例4-4展示更新后的index()視圖函數(shù)。
示例4-4. hello... 閱讀 1453·2021-09-28 09:44 閱讀 2519·2021-09-28 09:36 閱讀 1189·2021-09-08 09:35 閱讀 1992·2019-08-29 13:50 閱讀 820·2019-08-29 13:29 閱讀 1142·2019-08-29 13:15 閱讀 1735·2019-08-29 13:00 閱讀 3003·2019-08-26 16:16
{% block scripts %}
{{ super() }}
{% endblock %}
3、自定義錯(cuò)誤頁(yè)面
@app.errorhandler(404)
def page_not_found(e):
return render_template("404.html"), 404
@app.errorhandler(500)
def internal_server_error(e):
return render_template("500.html"), 500
{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}
{% endblock %}
{% block content %}
{% extends "base.html" %}
{% block title %}Flasky - Page Not Found{% endblock %}
{% block page_content %}
Not Found
{% extends "base.html" %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
Hello, {{ name }}!
相關(guān)文章
Flask Web Development —— Web表單(上)
Flask Web Development —— 模板(下)
Flask Web Development —— 模板(上)
Flask Web Development —— Email
Flask Web Development —— Web表單(下)
發(fā)表評(píng)論
0條評(píng)論
eternalshallow
男|高級(jí)講師
TA的文章
閱讀更多
如何提交百度新聞源?百度新聞源申請(qǐng)方法步驟
程序員年紀(jì)大了以后都去了哪里
NXP RT1064學(xué)習(xí)筆記(一)— 開(kāi)發(fā)環(huán)境
css總結(jié)
如何使用Flexbox和CSS Grid,實(shí)現(xiàn)高效布局
史上前端面試最全問(wèn)答(附答案)
前端面試題2017(篇幅長(zhǎng),附答案)
巧用命令行工具UCloud CLI,輕量操作API管理云資源