Django自定義過濾器中is_safe和need_autoescape兩個參數(shù)的理解

自定義template過濾器的方法參考文檔,不再贅述

is_safe

文檔說明過濾的兩種最終形態(tài),其中一種是設置register.filter(is_safe=True),但是對is_safe的具體作用說的云山霧繞的,而查了些博文只是簡單的說is_safe可以關閉掉自動轉(zhuǎn)義(這個說法是錯誤的!)
我嘗試了加或者不加is_safe的效果

@register.filter
def demo(value):
    return '<br>' + value

@register.filter(is_safe=True)
def demo(value):
    return '<br>' + value

<li> {{ text|demo}} </li>

結(jié)果就是都對過濾器返回的結(jié)果進行了轉(zhuǎn)義!
后來發(fā)現(xiàn)重點在于文檔中的這一句話:

This flag tells Django that if a “safe” string is passed into your filter, the result will still be “safe” and if a non-safe string is passed in, Django will automatically escape it, if necessary.
這個標志告訴Django 如果"安全"的字符串傳遞到您的過濾,結(jié)果仍將是"安全",如果一個非安全字符串傳遞,如果必要Django 會自動轉(zhuǎn)義它。

重點在于"安全",也就是文檔中提到的SafeData類型.文檔中有提到'某些正常的字符串操作會將SafeData對象轉(zhuǎn)換成普通的str或unicode對象,Django的過濾器在完成之后會修復這種破壞,并且很困難'.
這才是is_safe的意義所在:如果傳入的value已經(jīng)是SafeData對象,is_safe會告訴Django當前過濾器輸出的數(shù)據(jù)不再需要轉(zhuǎn)義.
至于SafeData類型數(shù)據(jù)的來源,我暫時只知道mark_safe()函數(shù)會返回SafeData對象.

from django.utils.safestring import mark_safe

@register.filter()
def to_safe(value):
    return mark_safe(value)

@register.filter(is_safe=True)
def demo(value):
    return '<br>' + value

<li> {{ test|to_safe|demo }} </li>

這樣的情況,demo過濾器接收到一個SafeData對象,其結(jié)果不會再轉(zhuǎn)義(<br>換行符起作用了).

need_autoescape

如果在注冊過濾器時添加了need_autoescape=True,那么過濾器必須接收一個autoescape參數(shù),這樣過濾器會捕捉其引用位置的自動轉(zhuǎn)義是否開啟,以決定你在過濾器中的行為.
引用下文檔中的栗子:

@register.filter(needs_autoescape=True)
def initial_letter_filter(text, autoescape=True):
    first, other = text[0], text[1:]
    if autoescape:
        esc = conditional_escape
    else:
        esc = lambda x: x
    result = '<strong>%s</strong>%s' % (esc(first), esc(other))
    return mark_safe(result)

該過濾器的輸出通過mark_safe()函數(shù)標記為"安全",這樣可以保證在過濾器中引入的HTML標簽可以實現(xiàn).但是同樣要考慮輸入的安全問題.如果模板中autoescape是開啟的,說明我們已經(jīng)認定這部分的數(shù)據(jù)是存在威脅的,所以需要在過濾器中手動對輸入數(shù)據(jù)進行轉(zhuǎn)義來保證其安全性.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容