flask框架渲染Jinja模板與傳入模板變量操作詳解
本文實(shí)例講述了flask框架渲染Jinja模板與傳入模板變量操作。分享給大家供大家參考,具體如下:
1. 模板簡(jiǎn)介
模板是一個(gè)web開(kāi)發(fā)中必備的模塊,因?yàn)槲覀冊(cè)阡秩疽粋€(gè)網(wǎng)頁(yè)的時(shí)候,并不只是渲染了一個(gè)純文本字符竄,而是渲染一個(gè)有富文本標(biāo)簽的頁(yè)面,這個(gè)時(shí)候我們就需要用到模板了。在flask中,配套的模板是Jinja2,Jinja2的作者也是flask的作者。
2. flask中渲染模板
在flask中,如果我們需要渲染一個(gè)模板,那么我們就需要用到render_template這個(gè)方法了。
在我們新建一個(gè)flask項(xiàng)目的時(shí)候,會(huì)同時(shí)生成一個(gè)templates的文件夾,然后我們就在里面新建一個(gè)index.html的文件。然后寫(xiě)入測(cè)試代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>index</h1> </body> </html>
然后我們?cè)赼pp.py文件中寫(xiě)一個(gè)視圖函數(shù)渲染我們的index.html文件。
from flask import render_template @app.route('/index/') def index(): return render_template('index.html')
這樣,我們就成功的對(duì)html頁(yè)面進(jìn)行了渲染。然后我們運(yùn)行項(xiàng)目,輸入網(wǎng)址就能夠查看到效果了。
3. flask中模板文件查找路徑
在上面的render_template函數(shù)中,為什么我們直接寫(xiě)入index.html,flask就會(huì)知道去templates文件夾里面去找這個(gè)文件呢。而不是去其他位置查找index.html文件呢。這是因?yàn)樵趂lask中,默認(rèn)的查找模板路勁就在項(xiàng)目的根目錄下面的templates文件夾。所以當(dāng)我們寫(xiě)模板文件的時(shí)候,都會(huì)寫(xiě)在templates下面。
在flask中,我們也是可以修改模板的存放位置的,比如我們將模板文件存放位置修改為E:\templates,那么我們就可以這樣寫(xiě)。
from flask import Flask,render_template app = Flask(__name__,template_folder=r'E:\templates')
這樣,flask每次查找模板文件路徑的時(shí)候,就回去這個(gè)文件夾下面尋找,如果沒(méi)有找到,就會(huì)報(bào)一個(gè)jinja2.exceptions.TemplateNotFound的錯(cuò)誤,所以,當(dāng)我們遇到了這個(gè)錯(cuò)誤的時(shí)候,我們就要知道是哪個(gè)位置出問(wèn)題了。
4. 模板中傳入?yún)?shù)
在一個(gè)模板中,我們不可避免的會(huì)傳入一些參數(shù),那么在flask中,應(yīng)該怎樣闖入?yún)?shù)呢。
首先編寫(xiě)一個(gè)視圖,然后在render_template中傳入一個(gè)關(guān)鍵字參數(shù),例如下面的username=‘xxx'
from flask import render_template @app.route('/index/') def index(): return render_template('index.html',username='xxx')
然后我們?cè)谀0逯性鯓邮褂眠@個(gè)變量呢?我們?cè)趇ndex.html中寫(xiě)入以下代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>index</h1> <p>userneme: {{ username }}</p> </body> </html>
所以,我們?cè)谀0逯型ㄟ^(guò) {{ username }}就可以拿到我們沖視圖中傳入的值了。也就是說(shuō),在Jinja2模板中,是通過(guò){{ 變量名 }}來(lái)獲取數(shù)據(jù)的,如果我們?cè)趝{ }}中傳入了一個(gè)視圖并沒(méi)有穿給我們的變量,那么也不會(huì)報(bào)錯(cuò),只是什么都不顯示而已。
如果我們需要傳入多個(gè)參數(shù),只需要依次在render_template函數(shù)中傳入我們的關(guān)鍵之參數(shù)就可以了。
示例:
return render_template('index.html',username='xxx',age=18,...)
但是如果我們參數(shù)很多的話,那么這樣我們也不方便我們管理和查看,這個(gè)時(shí)候我們就可以換一種方式了,定義一個(gè)字典,來(lái)存放所有的變量,然后在傳入模板中
示例:
@app.route('/index/') def index(): context = { 'username':'xxx', 'age':18, 'height':180, } return render_template('index.html',context=context)
但是這個(gè)時(shí)候,當(dāng)我們?cè)谀0逭抑兄苯虞斎雥{ username }},{{ age }}, {{ height }}的時(shí)候,是獲取不到我們的數(shù)據(jù)的,因?yàn)槲覀兪褂眠@種方法的話,在模板中,獲取參數(shù)就需要改變一下方式了。變成下面這樣.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>index</h1> <p>userneme: {{ context.username }}</p> <p>userneme: {{ context['age'] }}</p> <p>userneme: {{ context.height }}</p> </body> </html>
在上面模板中,我們使用了兩種方式得到參數(shù),context['username']和context.username。因?yàn)閏ontext是一個(gè)字典,所以使用這兩種方法都是可以的。
但是這樣我們?nèi)匀挥X(jué)得不方便,每次都需要通過(guò)context才能獲取到我們傳入的參數(shù)。那么我們可不可以不通過(guò)context才能獲取參數(shù)呢,答案是可以的。
實(shí)例:
@app.route('/index/') def index(): context = { 'username':'xxx', 'age':18, 'height':180, } return render_template('index.html',**context)
我們?cè)谝晥D函數(shù)中這樣寫(xiě),我們就需要通過(guò)context才能得到我們的參數(shù)了。
**context其實(shí)就是將這個(gè)字典打撒開(kāi)來(lái),形成關(guān)鍵字參數(shù)。所以,他和下面這種寫(xiě)法是完全一樣的。
@app.route('/index/') def index(): return render_template('index.html',username='xxx',age=18,height=180)
一般我們?cè)陧?xiàng)目的開(kāi)發(fā)中,我們都是使用**context這種寫(xiě)法。
當(dāng)然,在我們的實(shí)際開(kāi)發(fā)中,傳送的數(shù)據(jù)肯定不是這么簡(jiǎn)單,一般都有數(shù)據(jù)嵌套之類(lèi)的,還有對(duì)象。
例如下面這樣:
# 定義一個(gè)Person類(lèi) class Person(): def __init__(self,name,age): self.name = name self.age = age person = Person('小明', 18) # 實(shí)例化一個(gè)Person對(duì)象 @app.route('/') def index(): context = { 'username':'xujin', 'age':18, 'children':{ 'name':'hah', 'height':190, }, 'person':person, 'list':[1,2,3] } return render_template('index.html',**context)
其實(shí)在Jinja2模板中,我們對(duì)數(shù)據(jù)的操作和在python都是差不多的,像上面這種數(shù)據(jù),我們就可以通過(guò)下面的方式來(lái)獲取。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>index</h1> hello {{ username }} <p> {{ children.name}} </p> <p> {{ children['height'] }} </p> {{ person }} {{ person.name }} {{ person.age }} {{ list }} {{ list[1] }} </body> </html>
5. url_for的使用
在模板中,我們一般也少不了需要url地址,而我們直接手動(dòng)寫(xiě)入url地址的話,不方便我們后面的管理,所以一般我們都會(huì)使用url_for函數(shù)構(gòu)造我們的url。
比如我們有一個(gè)login頁(yè)面,然后我么需要從首頁(yè)點(diǎn)擊登錄之后,就跳轉(zhuǎn)至login頁(yè)面,那么我們需要這樣做。
@app.route('/login/') def login(): return "這是login頁(yè)面" @app.route('/index/') def login(): return render_template('index.html')
然后我們?cè)趇ndex.html中寫(xiě)入
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h1>index</h1> <p><a href="/login/" rel="external nofollow" >登陸</a></p> <p><a href="{{ url_for('login') }}" rel="external nofollow" >登陸</a></p> </body> </html>
上面兩種方式一種是直接寫(xiě)死url的方式,一種就是使用url_for的的方式。一般我們都是會(huì)使用url_for這種方式的。
如果我們的url需要參數(shù),那么其實(shí)和在視圖中傳入?yún)?shù)是一樣的。
示例:
@app.route('/user/<int:user_id>/') def user(user_id): return "user id is %s " % user_id
模板文件中寫(xiě)入
<a href="{{ url_for('user',user_id=1,next='xxx') }}" rel="external nofollow" >user</a> <!-- 等價(jià)于下面這樣 --> <a href="/user/1/?next=xxx" rel="external nofollow" >user</a>
希望本文所述對(duì)大家基于flask框架的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法
今天小編就為大家分享一篇numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python?PDF轉(zhuǎn)化wolrd代碼的寫(xiě)法小結(jié)
將PDF文件轉(zhuǎn)換為Word文檔的過(guò)程通常需要使用一些外部庫(kù)來(lái)實(shí)現(xiàn),因?yàn)镻ython本身并不直接支持這種轉(zhuǎn)換,這篇文章主要介紹了Python?PDF轉(zhuǎn)化wolrd代碼的寫(xiě)法小結(jié),需要的朋友可以參考下2024-06-06Python Playwright安裝和基本使用問(wèn)題記錄
這篇文章主要介紹了Playwright安裝和基本使用問(wèn)題記錄,playwright是一款新型的自動(dòng)化測(cè)試工具,功能非常強(qiáng)大,有很多優(yōu)點(diǎn),缺點(diǎn)就是使用的人比較少,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Python實(shí)現(xiàn)將長(zhǎng)圖制作成一個(gè)視頻
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)將一個(gè)長(zhǎng)圖制作成一個(gè)視頻,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05詳解python如何根據(jù)參數(shù)不同調(diào)用不同的類(lèi)和方法
這篇文章主要為大家詳細(xì)介紹了在python中如何根據(jù)參數(shù)不同調(diào)用不同的類(lèi)和方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03python裝飾器實(shí)現(xiàn)對(duì)異常代碼出現(xiàn)進(jìn)行自動(dòng)監(jiān)控的實(shí)現(xiàn)方法
這篇文章主要介紹了python裝飾器實(shí)現(xiàn)對(duì)異常代碼出現(xiàn)進(jìn)行自動(dòng)監(jiān)控的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09