DJANGO基礎學習之轉義總結:escape,autoescape,safe,mark_safe


何謂轉義?就是把html語言的關鍵字過濾掉。例如,<div>就是html的關鍵字,如果要在html頁面上呈現<div>,其源代碼就必須是&lt;div&gt; 
PS:轉義其實就是把HTML代碼給轉換成HTML實體了!

默認情況下,django自動為開發者提供escape功能,即在html代碼render之前,先進行轉義,然后再呈現出來。這樣的話,我們如果想輸出一個鏈接,被轉義之后,可能就無法得到我們想要的結果。 

例如,下面的method,如果用戶是匿名用戶,則輸出“匿名用戶”,否則,輸出一個鏈接,指向用戶的profile: 

def get_username(self): 

       return “<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username) 



在template文件中,如果這樣使用上面的方法: 

{{topic.get_username}} 

這樣,輸出的結果不是一個鏈接,而是上面鏈接轉義后的原文。我們無法得到我們想要的結果。 



有以下幾種方法解決自動轉義的問題: 

1、filter中 

修改filter函數的is_safe屬性: 

@register.filter 

def myfilter(value): 

    return value 

myfilter.is_safe = True 

如果你需要更復雜一些,可以親自來處理escape屬性。 

首先,設置filter的need_autoesacpe屬性為True(默認為False),這個參數告訴django,該filter需要一個傳遞一個autoesacape的參數,標示是否需要進行轉義處理,如果為True,則轉義,反之則反。完整的例子如下: 



from django.utils.html import conditional_escape 

from django.utils.safestring import mark_safe 



def initial_letter_filter(text, autoescape=None): 

    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) 

initial_letter_filter.needs_autoescape = True 





2、template中 

去掉template中的自動轉義可以使用filter safe,也可以使用auotescape標簽,還可以修改render的autoescape屬性。 

使用safe filter: 

This will be escaped: {{ data }} 

This will not be escaped: {{ data|safe }} 



使用autoescape標簽: 

Auto-escaping is on by default. Hello {{ name }} 



{% autoescape off %} 

    This will not be auto-escaped: {{ data }}. 



    Nor this: {{ other_data }} 

    {% autoescape on %} 

        Auto-escaping applies again: {{ name }} 

    {% endautoescape %} 

{% endautoescape %} 

如果在autoescape的標簽中include 其他的tags,autoescape的屬性將被子tags繼承。 



修改Context類的autoescape屬性: 

def render(self, context): 

    # … 

       new_context = Context({‘var’: obj}, autoescape=context.autoescape) 



注:autoescape標簽的優先級高於Context類的autoescape屬性,即如果Context中autoescape設置與模板中autoescape標簽沖突,則使用autoescape標簽的autoescape設置值。 



>>> from django import template 

>>> H=’{% autoescape off %}{{div}}{% endautoescape %}’ 

>>> c = template.Context({’div’:”<div>”}, autoescape=True) 

>>> template.Template(H).render(c) 

u’<div>’ 

>>> 

>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’ 

>>> c = template.Context({’div’:”<div>”}, autoescape=True) 

>>> template.Template(H).render(c) 

u’&lt;div&gt;’ 

>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’ 

>>> c = template.Context({’div’:”<div>”}, autoescape=False) 

>>> template.Template(H).render(c) 

u’&lt;div&gt;’ 

>>> 



3、使用方法函數mark_safe 

使用mark_safe函數標記后,django將不再對該函數的內容進行轉義,上面的get_username可以修改為: 

from django.utils.safestring import mark_safe 

def get_username(self): 
      return mark_safe(”<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username))
 
0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM