Python--jinja2語法

import jinja2
'''jinja2語法'''

基本語法

{# This is jinja code
    # 控制結(jié)構(gòu)
    {% for file in filenames %}
        # 取值
        {{ file }}
    {% endfor %}
#}

jinja2變量

  • jinja2支持python中所有的Python數(shù)據(jù)類型比如列表旺聚、字段、對象等。
<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>
  • jinja2中的過濾器
過濾器名稱 說明
safe 渲染時值不轉(zhuǎn)義
capitialize 把值的首字母轉(zhuǎn)換成大寫填帽,其他子母轉(zhuǎn)換為小寫
lower 把值轉(zhuǎn)換成小寫形式
upper 把值轉(zhuǎn)換成大寫形式
title 把值中每個單詞的首字母都轉(zhuǎn)換成大寫
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML標簽都刪掉
join 拼接多個值為字符串
replace 替換字符串的值
round 默認對數(shù)字進行四舍五入蛛淋,也可以用參數(shù)進行控制
int 把值轉(zhuǎn)換成整型
{{ 'abc' | captialize  }}

Abc

{{ 'abc' | upper  }}

ABC

{{ 'hello world' | title  }}

Hello World

{{ "hello world" | replace('world','daxin') | upper }}

HELLO DAXIN

{{ 18.18 | round | int }}

18

jinja2的控制結(jié)構(gòu)

  • jinja2中的if語句類似與Python的if語句,它也具有單分支篡腌,多分支等多種結(jié)構(gòu)褐荷,不同的是,條件語句不需要使用冒號結(jié)尾嘹悼,而結(jié)束控制語句叛甫,需要使用endif關(guān)鍵字。
{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}

jinja2的for循環(huán)

  • 迭代列表
<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul>

迭代字典

<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl>
變量 描述
loop.index 當前迭代的索引(從1開始)
loop.index0 當前迭代的索引(從0開始)
loop.first 是否是第一次迭代杨伙,返回bool
loop.last 是否是最后一次迭代其监,返回bool
loop.length 序列中的項目數(shù)量
loop.revindex 到循環(huán)結(jié)束的次數(shù)(從1開始)
loop.revindex0 到循環(huán)結(jié)束的次數(shù)(從0開始)

jinja2的宏

  • 宏類似于Python中的函數(shù),我們在宏中定義行為限匣,還可以進行傳遞參數(shù)抖苦,就像Python中的函數(shù)一樣一樣兒的。
  • 在宏中定義一個宏的關(guān)鍵字是macro米死,后面跟其 宏的名稱和參數(shù)等
{% macro input(name,age=18) %}   # 參數(shù)age的默認值為18
    <input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %}
  • 調(diào)用方法也和Python的類似
<p>{{ input('daxin') }} </p>
<p>{{ input('daxin',age=20) }} </p>

jinja2的繼承和Super函數(shù)

  • jinja2中最強大的部分就是模板繼承锌历。模板繼承允許我們創(chuàng)建一個基本(骨架)文件,其他文件從該骨架文件繼承峦筒,然后針對自己需要的地方進行修改究西。
  • jinja2的骨架文件中,利用block關(guān)鍵字表示其包涵的內(nèi)容可以進行修改物喷。
以下面的骨架文件base.html為例:
<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <link rel="stylesheet" href="style.css"/>
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
    {% block  footer %}
    <script>This is javascript code </script>
    {% endblock %}
</div>
</body>
</html>
  • 這里定義了四處 block卤材,即:head,title峦失,content扇丛,footer。那怎么進行繼承和變量替換呢宠进?注意看下面的文件
{% extend "base.html" %}       # 繼承base.html文件
 
{% block title %} Dachenzi {% endblock %}   # 定制title部分的內(nèi)容
 
{% block head %}
    {{  super()  }}        # 用于獲取原有的信息
    <style type='text/css'>
    .important { color: #FFFFFF }
    </style>
{% endblock %}   
  • 其他不修改的原封不同的繼承

利用jinja2進行渲染

  • jinja2模塊中有一個名為Enviroment的類晕拆,這個類的實例用于存儲配置和全局對象藐翎,然后從文件系統(tǒng)或其他位置中加載模板材蹬。

基本使用方法

-  大多數(shù)應(yīng)用都在初始化的時候撞見一個Environment對象,并用它加載模板吝镣。Environment支持兩種加載方式:

  • PackageLoader:包加載器
  • FileSystemLoader:文件系統(tǒng)加載器
  • PackageLoader
  • 使用包加載器來加載文檔的最簡單的方式如下:
from jinja2 import PackageLoader,Environment
env = Environment(loader=PackageLoader('python_project','templates'))    # 創(chuàng)建一個包加載器對象
 
template = env.get_template('bast.html')    # 獲取一個模板文件
template.render(name='daxin',age=18)   # 渲染
其中:
  • PackageLoader()的兩個參數(shù)為:python包的名稱堤器,以及模板目錄名稱。
  • get_template():獲取模板目錄下的某個具體文件末贾。
  • render():接受變量闸溃,對模板進行渲染
  • FileSystemLoader
  • 文件系統(tǒng)加載器,不需要模板文件存在某個Python包下,可以直接訪問系統(tǒng)中的文件辉川。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末表蝙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乓旗,更是在濱河造成了極大的恐慌府蛇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屿愚,死亡現(xiàn)場離奇詭異汇跨,居然都是意外死亡,警方通過查閱死者的電腦和手機妆距,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門穷遂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娱据,你說我怎么就攤上這事蚪黑。” “怎么了中剩?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵祠锣,是天一觀的道長。 經(jīng)常有香客問我咽安,道長伴网,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任妆棒,我火速辦了婚禮澡腾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糕珊。我一直安慰自己动分,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布红选。 她就那樣靜靜地躺著澜公,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喇肋。 梳的紋絲不亂的頭發(fā)上坟乾,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音蝶防,去河邊找鬼甚侣。 笑死,一個胖子當著我的面吹牛间学,可吹牛的內(nèi)容都是我干的殷费。 我是一名探鬼主播印荔,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼详羡!你這毒婦竟也來了仍律?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤实柠,失蹤者是張志新(化名)和其女友劉穎染苛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體主到,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡茶行,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了登钥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔师。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牧牢,靈堂內(nèi)的尸體忽然破棺而出看锉,到底是詐尸還是另有隱情,我是刑警寧澤塔鳍,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布伯铣,位于F島的核電站,受9級特大地震影響轮纫,放射性物質(zhì)發(fā)生泄漏腔寡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一掌唾、第九天 我趴在偏房一處隱蔽的房頂上張望放前。 院中可真熱鬧,春花似錦糯彬、人聲如沸凭语。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽似扔。三九已至,卻和暖如春搓谆,著一層夾襖步出監(jiān)牢的瞬間炒辉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工挽拔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辆脸,地道東北人但校。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓螃诅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子术裸,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 介紹 Jinja是基于python的模板引擎倘是,功能比較類似于于PHP的smarty,J2ee的Freemarker...
    ZhouLang閱讀 7,855評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 模板: 在之前的章節(jié)中袭艺,視圖函數(shù)只是直接返回文本搀崭,而在實際生產(chǎn)環(huán)境中其實很少這樣用,因為實際的頁面大多是帶有樣式和...
    帥氣的Lucky閱讀 1,765評論 0 1
  • 張王官村是母親的出生地猾编,上個世紀五十年代末農(nóng)歷十月瘤睹,魯北大地一片凄冷蕭殺,農(nóng)民的日子過得異常凄苦答倡,原本清貧的家庭迎...
    明O亮閱讀 290評論 0 3
  • 那日初見,把酒言歡 觥籌之間,意綿綿 奈何別離刨啸,散盡天涯曲 等客坐南浦履恩,只怕淚千行 十年生涯,再相逢 憶往昔倔既,不問...
    秀逗頌哇哈哈閱讀 123評論 0 2