最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

flask框架渲染Jinja模板與傳入模板變量操作詳解

 更新時(shí)間:2020年01月25日 09:57:25   作者:stu_xujin  
這篇文章主要介紹了flask框架渲染Jinja模板與傳入模板變量操作,結(jié)合實(shí)例形式詳細(xì)分析了flask框架模板相關(guān)原理、模板渲染、傳入?yún)?shù)等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下

本文實(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的文件。然后寫入測(cè)試代碼:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
</head>
<body>
 <h1>index</h1>
</body>
</html>

然后我們?cè)赼pp.py文件中寫一個(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ù)中,為什么我們直接寫入index.html,flask就會(huì)知道去templates文件夾里面去找這個(gè)文件呢。而不是去其他位置查找index.html文件呢。這是因?yàn)樵趂lask中,默認(rèn)的查找模板路勁就在項(xiàng)目的根目錄下面的templates文件夾。所以當(dāng)我們寫模板文件的時(shí)候,都會(huì)寫在templates下面。

在flask中,我們也是可以修改模板的存放位置的,比如我們將模板文件存放位置修改為E:\templates,那么我們就可以這樣寫。

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ù)呢。

首先編寫一個(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中寫入以下代碼

<!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ù)中這樣寫,我們就需要通過(guò)context才能得到我們的參數(shù)了。

**context其實(shí)就是將這個(gè)字典打撒開(kāi)來(lái),形成關(guān)鍵字參數(shù)。所以,他和下面這種寫法是完全一樣的。

@app.route('/index/')
def index():
  return render_template('index.html',username='xxx',age=18,height=180)

一般我們?cè)陧?xiàng)目的開(kāi)發(fā)中,我們都是使用**context這種寫法。

當(dāng)然,在我們的實(shí)際開(kāi)發(fā)中,傳送的數(shù)據(jù)肯定不是這么簡(jiǎn)單,一般都有數(shù)據(jù)嵌套之類的,還有對(duì)象。
例如下面這樣:

# 定義一個(gè)Person類
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)寫入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中寫入

<!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>

上面兩種方式一種是直接寫死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

模板文件中寫入

<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)文章

  • pyqt6實(shí)現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼

    pyqt6實(shí)現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼

    本文主要介紹了pyqt6實(shí)現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Python3.5字符串常用操作實(shí)例詳解

    Python3.5字符串常用操作實(shí)例詳解

    這篇文章主要介紹了Python3.5字符串常用操作,結(jié)合實(shí)例形式總結(jié)分析了Python3.5字符串輸入、輸出、格式化、切片以及各種常用操作函數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2019-05-05
  • python配置虛擬環(huán)境步驟

    python配置虛擬環(huán)境步驟

    大家好,本篇文章主要講的是python配置虛擬環(huán)境步驟,感興趣的同學(xué)趕快來(lái)看一看,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python封裝解構(gòu)以及丟棄變量

    Python封裝解構(gòu)以及丟棄變量

    這篇文章主要介紹了Python封裝解構(gòu)以及丟棄變量,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • 使用Python將PPT的幻燈片和形狀轉(zhuǎn)為多種圖片格式

    使用Python將PPT的幻燈片和形狀轉(zhuǎn)為多種圖片格式

    這篇文章主要為大家詳細(xì)介紹了如何使用Python?將PPT幻燈片和形狀轉(zhuǎn)換為多種圖片格式,即JPG,?PNG,?BMP,?SVG,?TIFF,需要的可以參考下
    2025-02-02
  • python機(jī)器學(xué)習(xí)darts時(shí)間序列預(yù)測(cè)和分析

    python機(jī)器學(xué)習(xí)darts時(shí)間序列預(yù)測(cè)和分析

    這篇文章主要介紹了python機(jī)器學(xué)習(xí)darts時(shí)間序列預(yù)測(cè)和分析使用實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 基于python yield機(jī)制的異步操作同步化編程模型

    基于python yield機(jī)制的異步操作同步化編程模型

    這篇文章主要介紹了基于python yield機(jī)制的異步操作同步化編程模型,需要的朋友可以參考下
    2016-03-03
  • 閉包在python中的應(yīng)用之translate和maketrans用法詳解

    閉包在python中的應(yīng)用之translate和maketrans用法詳解

    這篇文章主要介紹了閉包在python中的應(yīng)用之translate和maketrans用法,是比較實(shí)用的技巧,需要的朋友可以參考下
    2014-08-08
  • 詳解Python requests模塊

    詳解Python requests模塊

    今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著Python requests模塊展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python數(shù)據(jù)結(jié)構(gòu)集合的相關(guān)詳解

    Python數(shù)據(jù)結(jié)構(gòu)集合的相關(guān)詳解

    集合是Python中一種無(wú)序且元素唯一的數(shù)據(jù)結(jié)構(gòu),主要用于存儲(chǔ)不重復(fù)的元素,Python提供set類型表示集合,可通過(guò){}或set()創(chuàng)建,集合元素不可重復(fù)且無(wú)序,不支持索引訪問(wèn),但可迭代,集合可變,支持添加、刪除元素,集合操作包括并集、交集、差集等,可通過(guò)運(yùn)算符或方法執(zhí)行
    2024-09-09

最新評(píng)論

开化县| 习水县| 九台市| 宿州市| 德令哈市| 通山县| 尚义县| 潜江市| 洛扎县| 和顺县| 嵊泗县| 沂南县| 井研县| 股票| 尚志市| 莲花县| 丹凤县| 西藏| 临西县| 巴林右旗| 炎陵县| 钦州市| 东兴市| 蓬溪县| 潮州市| 长沙市| 新野县| 扎兰屯市| 集贤县| 稷山县| 洛南县| 桂东县| 珲春市| 大名县| 贵阳市| 怀远县| 达拉特旗| 刚察县| 中江县| 定南县| 高雄市|