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
歡迎大家關注,點贊,收藏哦,您的支持是我加速更新和爲您寫出更好文章的動力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章