釋放雙眼,帶上耳機,聽聽看~!
「Flask筆記」 jinja2範本之篩選器。flask – jinja2範本之篩選器需要對傳入範本的變數做一些處理的時候,那麼就可以用到篩選器。語法:{{var | 篩選器名稱}},使用管道符連接常用篩選器abs(value):返回一個數值的絕對值。例如:-1|abs。
flask — jinja2範本之篩選器
需要對傳入範本的變數做一些處理的時候,那麼就可以用到篩選器。
語法:{{var | 篩選器名稱}}
,使用管道符連接
常用篩選器
abs(value)
:返回一個數值的絕對值。例如:-1|abs
。default(value,default_value)
:如果當前變數沒有值,則會使用參數中的值來代替。name|default('hello world')
,如果name
不存在,則會使用hello world
來代替。boolean=False
預設是在只 有這個變數為undefined
的時候才會使用default中的值,即None
,[]
,{}
等都不會使用default
的預設值,當boolean=True
的時候就可以使用預設來代替,或者用name or 'hello world'
來代替name|default('hello world',boolean=True)
預設的boolean
是True
first(value)
:返回一個序列的第一個元素。name|first
format(value,*args,**kwargs)
:格式化字符串。last(value)
:返回一個序列的最後一個元素。示例:names|last。
length(value)
:返回一個序列或者字典的長度。示例:names|length
join(value,d='u')
:將一個序列用d這個參數的值拼接成字符串int(value)
:將值轉換為int
類型float(value)
:將值轉換為float
類型lower(value)
:將字符串轉換為小寫upper(value)
:將字符串轉換為大寫replace(value,old,new)
:替換將old
替換為new
的字符串truncate(value,length=253,killwords=False)
:截取length長度的字符串striptags(value)
:刪除字符串中所有的HTML標籤,如果出現多個空格,將替換成一個空格trim
:截取字符串前面和後面的空白字符string(value)
:將變數轉換成字符串wordcount(s)
:計算一個長字符串中單詞的個數
自動轉義篩選器
escape(value)
或e:轉義字符,會將等符號轉義成HTML中的符號。例如content|escape
或content|e
,可以防禦範本導致的xss攻擊,但是不能防禦屬性注入xss
如果希望防禦屬性注入xss
那麼必須確保屬性中使用jinja表達式時,始終使用單引號或雙引號包裹。如“具體可以參考jinja2的安全注意事項safe(value)
:如果開啟了全局轉義,那麼safe
篩選器會將變數關掉轉義。示例:content_html|safe
autoescape
標籤
{% autoescape off %}
........
{% endautoescape %}
一部分篩選器演示
# 省略初始化
@app.route('
@app.route('/')
def hello_world():
context={
'signature':'hello, world!',
'sigatureNone':None,
'script':'<script>alert("/xss/")</script>',
'hello':'hello world',
'article':'hello world hello world'
}
return render_template('index.html',**context)
<!-- 省略其他標籤 -->
<p>這裡是default的冊數: {{ signature|default('這個人很懶,沒有留下任何說明') }}</p>
<p>這裡是Bool為False的測試:{{ sigatureNone|default('這個人很懶,沒有留下任何說明') }}</p>
<p>這裡是Bool為True的測試:{{ sigatureNone|default('這個人很懶,沒有留下任何說明',boolean=True) }}</p>
<p>這裡是Bool為True的測試:{{ sigatureNone or '這個人很懶,沒有留下任何說明' }}</p>
<p>這裡是script測試:{{ script }}</p> <!-- 預設開啟了自動轉義-->
{% autoescape off %} <!-- 使用這對標籤,對標籤內的內容關閉轉義-->
<p>這裡是script測試:{{ script}}</p>
{% endautoescape %}
<p>這裡是script|safe測試:{{ script|safe }}</p>
<p>這裡是replace測試:{{ hello|replace('world','flask') }}</p>
<p>這裡是truncate測試:{{ article|truncate(length=5) }}</p>
<p>這是striptags測試:{{ script|striptags }}</p>
自訂篩選器
簡單的小例子,刪除傳入字符中的執行字符
# 省略初始化
@app.template_filter('cut') #將定義的篩選器註冊到jinja中
def cut(value):
value = value.replace("hello","")
return value
@app.route('/')
def hello_world():
context={
'value':'hello world hello'
}
return render_template('index.html',**context)
<!-- 省略其他標籤 -->
<p>這是cut測試:{{ value|cut }}</p>
用自訂篩選器模擬時間顯示
# 省略初始化
from datetime import datetime #導入模塊
@app.route('/')
def hello_world():
context={
'time':datetime(2019,1,27,16,0,0) #設置一個時間做測試
}
return render_template('index.html',**context)
@app.template_filter('handle_time')
def handle_time(time):
"""
time看距離現在的時間間隔
1.如果間隔時間小於1分鐘,那麼就顯示"剛剛"
2.如果是一小時以內,那麼就顯示"xxx分鐘前"
3.如果是24小事以內,那麼就顯示"xxx小時前"
4.如果是大於24小時,小於30天以內,那麼就顯示"xxx天前"
5.否則就顯示具體時間
"""
if isinstance(time,datetime):
now = datetime.now()
timestamp = (now-time).total_seconds()
#total_seconds()是獲取兩個時間之間的總差。seconds()方法僅獲取時間差的秒數,忽略天數
if timestamp < 60:
return "剛剛"
elif 60 * 60 > timestamp >= 60:
minutes = timestamp / 60
return "%s分鐘前" % int(minutes)
elif 60 * 60 * 24 > timestamp > 60 * 60:
hours = timestamp / (60 * 60)
return "%s小時前" % int(hours)
elif 60 * 60 * 24 * 30 > timestamp > 60 * 60 * 24:
days = timestamp / (60 * 60 * 24)
return "%s天前" % int(days)
else:
return time.strftime('%Y/%M/%d %H:%M')
<!-- 省略其他標籤 -->
<p>這是handle_time測試:{{ time|handle_time }}</p>
聲明:本文為原創作品,版權歸作者所有。未經許可,不得轉載或用於任何商業用途。如若本站內容侵犯了原著者的合法權益,可聯繫我們進行處理。