測試器
在Jinja2中,測試器(Test)是一些用來測試變量或者表達式,返回布爾值的特殊函數
例如,用測試器來判斷一個變量或表達式是否是一個數字
{% if age is number %} {{ age*365 }} {% else %} 數字無效 {% endif %}
內置測試器
Jinja2內置了許多測試器,其中比較常用的有
- calable(obj) 判斷對象是否可以被調用
- defined(value) 判斷變量是否已經定義
- undefiend(value) 判斷變量是否未定義
- none(value) 判斷變量是否爲none
- number(value) 判斷變量是否是數字
- string(value) 判斷變量是否是字符串
- sequence(value) 判斷變量是否是序列,比如字符串、列表、元組
- iterable(value) 判斷變量是否可迭代
- mapping(value) 判斷變量是否是匹配對象,比如字典
- sameas(value,other) 判斷變量與other是否指向相同內存地址
使用方法
if左側是測試器的第一個參數,其他參數可以寫在括號內
{% if foo is sameas(bar) %}
也可以在右側用空格鏈接
{% if foo is sameas bar %}
自定義測試器
和自定義過濾器類似,我們可以用Flask提供的app.template_test()裝飾器來註冊一個自定義測試器
例如
@app.template_test() def baz(n): if n == 'ok': return True else: return False
效果圖
數字無效 之前的是以前寫的,與這篇文章內容無關。
模板環境對象
Jinja2中,渲染行爲由jinja2.Enviroment類控制,所有的配置選項、上下文變量、全局函數、過濾器和測試器都存儲在Enviroment上。在與Flask結合後,我們不單獨創建Enviroment對象,而是使用Flask創建的Enviroment對象,它存儲在app.jinja_env上。
模板環境中的全局函數、過濾器和測試器分別存儲在Enviroment對象的globals、filters和tests 屬性中,這些都是字典對象。除了之前介紹的使用Flask裝飾器和方法註冊自定義函數,我們也可以直接操作這三個字典來添加相應的函數或變量。
例如
1.添加自定義全局對象
def bar(): return "I'm bar." foo = "I'm foo" app.jinja_env.globals['bar'] = bar app.jinja_env.globals['foo'] = foo
2.添加自定義過濾器
def smiling(s): return s + ':)' app.jinja_env.filters['smiling'] = smiling
3.添加自定義測試器
def baz(n): if n == 'ok': return True else: return False app.jinja_env.tests['baz'] = baz
模板結構組織
局部模板
在Web程序裏,我們通常會爲每一類頁面寫一個獨立的模板。比如主頁模板、用戶登陸模板。這些模板可以直接在視圖函數中渲染並作爲HTML響應主體。除了這些模板以外,我們還會用到另外一些模板,他們就是局部模板或者叫次模板,因爲他們僅包含部分代碼,所以我們不會在視圖函數中渲染它,而是插入到其他獨立模板中。
當多個獨立模板需要用到同一塊HTML代碼時,我們可以把這段代碼抽離出來作爲一個局部模板。這樣可以避免重複,同時也更好地進行統一管理。
例如,多個頁面中都要顯示一個同樣的提示條 ,我們把這個提示條單獨寫在一個HTML文件中,假設它就叫_banner.html。
我們使用include標籤來插入局部模板,這會把局部模板的內容插入到使用這個include標籤的位置。也就是說我們可以在任意模板中用以下代碼插入_banner.html的內容:
{% include '_banner.html' %}