1 模板引擎之過濾器 概念 : 過濾器本質上是個轉換函數,第一個參數是待過濾的變數。如果它有第二個參數,模板中就必須傳進去。 過濾器使用管道符| 放在{{ }} Jinja2模板引擎提供了豐富的內置過濾器,主要分為以下幾類: (1) 字元串進行操作: (2) 對列表進行操作 (3) 對數值進行操作: ...
1 模板引擎之過濾器
概念 : 過濾器本質上是個轉換函數,第一個參數是待過濾的變數。如果它有第二個參數,模板中就必須傳進去。
過濾器使用管道符| 放在{{ }}
Jinja2模板引擎提供了豐富的內置過濾器,主要分為以下幾類:
(1) 字元串進行操作:
{# 當變數未定義時,顯示預設字元串 #}
<p>{{ name | default('None', true) }}</p>
{# 單詞首字母大寫 Yes#}
<p>{{ 'yes' | capitalize }}</p>
{# 單詞全小寫 xml#}
<p>{{ 'XML' | lower }}</p>
{# 去除字元串前後的空白字元 like#}
<p>{{ ' like ' | trim }}</p>
{# 字元串反轉,返回"olleh" #}
<p>{{ 'hello' | reverse }}</p>
{# format格式化 #}
{{ '我叫%s 我今年%d歲了 我的存款為%.2f'|format('小胖子',38,1.00002) }}
{# var|replace 替換 #}
{{ data.html|replace('h','x') }}
{# 關閉HTML自動轉義 #}
<p>{{ '<em>name</em>' | safe }}</p>
{% autoescape false %}
{# HTML轉義,即autoescape關了也轉義,可以縮寫為e #}
<p>{{ '<em>name</em>' | escape }}</p>
{% endautoescape %}
(2) 對列表進行操作
{# 取第一個元素12 #}
<p>{{ [12,21,33,44] | first }}</p>
{# 取最後一個元素44 #}
<p>{{ [12,21,33,44] | last }}</p>
{# 返回列表長度,可以寫為count #}
<p>{{ [1,2,3,4,5] | length }}</p>
{# 列表求和 #}
<p>{{ [12,21,33,44] | sum }}</p>
{# 列表排序,預設為升序 #}
<p>{{ [12,21,33,44] | sort }}</p>
{# 合併為字元串,返回"1 | 2 | 3 | 4 | 5" #}
<p>{{ [1,2,3,4,5] | join(' | ') }}</p>
{# 列表中所有元素都全大寫。這裡可以用upper,lower #}
<p>{{ ['good','nice','handsome'] | upper }}</p>
(3) 對數值進行操作: 取證
{# 四捨五入取整,返回3 #}
<p>{{ 3.14169 | round }}</p>
{# 向下截取到小數點後2位,返回3.14 #}
<p>{{ 3.14169 | round(2, 'floor') }}</p>
{# 絕對值,返回15 #}
<p>{{ -15 | abs }}</p>
{# var|list 將var值轉換為列表 #}
(4) 類型轉換
{# var|int 將var值轉換為整形 #}
{# var|string 將var值轉換為字元串類型 #}
{# var|float 將var值轉換為浮點形 #}
{# var|list 將var值轉換為列表 #}
(5) 變數輸出JSON格式字元串:一般結合javescript使用
<script type="text/javascript">
var arg = {{ args | tojson | safe }};
console.log(arg[1].name);
</script>
(6) 自定義過濾器
如果需要自定義過濾器,可以在主應用下定義個函數,因為過濾器本質也是函數
#定義過濾器函數
def filter(name):
return ....
#導入過濾器函數
app.add_template_filter(filter, 'fli')
2 模板引擎之測試器
概念: 測試器is返回結果為布爾值,一般與if控制語句搭配使用
(1)常見的內置測試器
{# 檢查變數是否被定義,也可以用undefined檢查是否未被定義 #}
{% if name is defined %}
<p>Name is: {{ name }}</p>
{% endif %}
{# 檢查是否所有字元都是大寫 #}
{% if name is upper %}
<h2>"{{ name }}" are all upper case.</h2>
{% endif %}
{# 檢查變數是否為空 #}
{% if name is none %}
<h2>Variable is none</h2>
{% endif %}
{# 檢查變數是否為字元串,也可以用number檢查是否為數值 #}
{% if name is string %}
<h2>{{ name }} is a string.</h2>
{% endif %}
{# 檢查變數是否可被迭代迴圈,也可以用sequence檢查是否是序列 #}
{% if [1,2,3] is iterable %}
<h2>Variable is iterable.</h2>
{% endif %}
{# 檢查變數是否是字典 #}
{% if {'name':'test'} is mapping %}
<h2>Variable is dict.</h2>
{% endif %}
(2) 自定義測試器
#定義想實現的功能
def func(str):
return ...
#導入該功能
app.add_template_test(func,'測試器名')
3 全局函數
(1) dict函數,用於生成字典
{% set user = dict('username'='張三','password'=20) %}
(2) joiner()函數:用於分割迴圈,第一次為空字元串,以後每次都是分割符
{% set star = joiner('*') %}
{% for val in range(4) %}
{{ star }} {{ val }}
{% endfor %}