「Flask筆記」 jinja2範本之篩選器

「Flask筆記」 jinja2範本之篩選器

資源介紹參數
資源類別: Python
如遇問題: 聯繫客服/留言反饋
釋放雙眼,帶上耳機,聽聽看~!
「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)預設的booleanTrue
  • 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|escapecontent|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>
聲明:本文為原創作品,版權歸作者所有。未經許可,不得轉載或用於任何商業用途。如若本站內容侵犯了原著者的合法權益,可聯繫我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧