Flask學習筆記之:jinja2變量過濾器以及自定義過濾器
何爲變量過濾器
網上解釋:
Django和Flask框架中都使用了jinja2模板引擎來渲染模板,通過後端向模板中傳遞變量,通過過濾器可以修改這些變量,過濾器添加在變量名之後,中間使用豎線分割。
我的理解:
變量過濾器其實就是執行一個函數,把變量傳入函數,把函數的返回值填充到這個位置。
變量過濾器的使用方式
(注意,既然我把變量過濾器看作一個函數,這裏我對參數個數的解釋就與網上的有些出入,這樣解釋是爲了方便我們自己寫過濾器,不要揪着到底算是沒有參數還是有一個參數不放,明白我的意思就好了)
使用方式爲:變量名 | 過濾器。
{{variable | filter_name(*args)}}
這個variable實際上作爲 filter_name函數的第一個參數傳入,第二和其它參數從*args中傳入。
如果只有一個參數傳給過濾器,則可以把括號省略掉
{{variable | filter_name}}
jinja2內置的變量過濾器
常見內建過濾器:
例子:
小寫轉爲大寫
<p>{{ 'hello' | upper }}</p>
字符串操作:
safe:禁用轉義
capitalize:把變量值的首字母轉成大寫,其餘字母轉小寫
lower:把值轉成小寫
upper:把值轉成大寫
title:把值中的每個單詞的首字母都轉成大寫
reverse:字符串反轉
format:格式化輸出
striptags:渲染之前把值中所有的HTML標籤都刪掉
truncate: 字符串截斷
列表操作:
first:取第一個元素
last:取最後一個元素
length:獲取列表長度
sum:列表求和
sort:列表排序
整塊操作
{% filter upper %}
balabala
balabala
{% endfilter %}
支持鏈式調用
在 jinja2 中,過濾器是可以支持鏈式調用的,示例如下:
{{ "hey, man!" | reverse | upper }}
自定義變量過濾器
儘管jinja2提供了豐富的內置過濾器,但是有些時候還是沒辦法滿足我們的需求。
好在jinja2支持自定義過濾器,我們來寫一個:
後端:
def stamp2time(stamp):
sec_count=int(time.time()-float(stamp))
if(sec_count<=25):
return "在線"+"("+ str(sec_count) +"秒前更新)"
elif(stamp!="0"):
minite_count=int(sec_count/60)
hour_count=int((sec_count/3600)%24)
day_count=int((sec_count/3600)/24)
tmp_str=' '
if(day_count>0):
tmp_str=str(day_count)+"天"
elif(hour_count>0):
tmp_str=str(hour_count)+"小時"
elif(minite_count>0):
tmp_str=str(minite_count)+"分鐘"
else:
tmp_str=str(sec_count)+"秒"
return "離線"+"("+tmp_str+"前更新)"
else:
return "從未上線"
#下面兩行不要忘記加入!
env = app.jinja_env#取得運行環境
env.filters['stamp2time'] = stamp2time#註冊自定義過濾器
前端:
<td>{{u.time|stamp2time}}</td>
其中:u.time傳入了數據庫中存儲的最近一次更新時間的時間戳,經過stamp2time轉化後變成了我們需要的文本。
可以看到,過濾器其實就是一個函數,自帶的過濾器的函數已經幫我們寫好了,自定義變量過濾器的函數我們自己寫就好了,就這麼簡單!
————————————————————————————————————————
END
歡迎大家關注,點贊,收藏哦,您的支持是我加速更新和爲您寫出更好文章的動力!