2010-01-12 96 views
52

我想顯示一個消息,通過新的Django消息框架顯示一點的HTML。如何在新的Django消息框架中的消息中輸出HTML?

def message_user(self, request, message): 
    """ 
    Send a message to the user. The default implementation 
    posts a message using the django.contrib.messages backend. 
    """ 
    messages.info(request, message) 

一切到目前爲止,我已經試過似乎顯示轉義的HTML:具體來說,我通過ModelAdmin.message_user方法,這僅僅是圍繞消息的薄包裝()這樣做。

self.message_user(request, "<a href=\"http://www.google.com\">Here's google!</a>") 

不工作,也不:

from django.utils.safestring import mark_safe 
... 
self.message_user(request, mark_safe("<a href=\"http://www.google.com\">Here's google!</a>")) 

在管理base.html文件模板模板代碼的顯示是非常簡單的:

{% if messages %} 
    <ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul> 
    {% endif %} 

所以我不完全確定我做錯了什麼。

想法或指導非常感謝,謝謝!

回答

15

你試過{{ message | safe }}嗎?

在Django模板系統模板變量總是逃脫,除非你指定他們與safe過濾器是安全的。這個默認值使得即使不知道受到注入攻擊的保護。

我不知道這是如何與mark_safe交互,但可能發生的事情之間,使它不安全。

+0

{{消息|安全}}確實工作;但是,這是一個內置的管理員基礎模板,所以編輯它並不那麼簡單(另外我不一定要將每條消息標記爲安全的)。 我很確定問題在於,因爲這是在請求週期內保存(並在下一個顯示),任何企圖將其標記爲安全的嘗試都是徒勞的。 – jsdalton 2010-01-12 23:48:40

+0

問題:當你把它放在隊列中時,你可以標記消息「安全」嗎?我沒有看,但這是我第一件事。 – 2010-01-13 01:42:48

+0

@Peter - 試過(通過mark_safe在我的問題中的代碼示例),但沒有運氣。從我所知道的情況來看,當消息被實際顯示時(在下面的請求中),這並沒有被保留。 – jsdalton 2010-01-13 13:29:41

17

如下面的Django的車票指出,如果結合使用mark_safe()與sessionStorage的後端它應該工作:https://code.djangoproject.com/ticket/14976#comment:9

+3

Thanks!一旦我將'MESSAGE_STORAGE ='django.contrib.messages.storage.session.SessionStorage''添加到我的'settings.py'中,使用普通老式mark_safe()就可以正常工作。 – rescdsk 2012-05-02 18:45:44

+0

這不適合我。我認爲它在設置消息並返回重定向時失敗。 – 2012-06-19 22:05:48

+0

如果會話後端是cookie,它會工作嗎? – 2012-11-20 16:46:41

61

另一種選擇是使用extra_tags關鍵字ARG表示一個消息是安全的。例如

messages.error(request, 'Here is a <a href="/">link</a>', extra_tags='safe') 

然後用模板邏輯使用安全過濾器

{% for message in messages %} 
    <li class="{{ message.tags }}"> 
    {% if 'safe' in message.tags %}{{ message|safe }}{% else %}{{ message }}{% endif %} 
    </li> 
{% endfor %} 
+3

感謝您的提示。我認爲這是這裏提到的最簡單但不顯眼且最安全的方法。您可以控制標記爲安全的郵件,而不是在全局範圍內盲目應用「{{message | safe}}」。 – Edwin 2012-06-08 17:35:01

+1

@Edwin爲什麼?何時顯示來自消息框架的消息不安全? – kissgyorgy 2013-07-08 04:46:22

+2

@Walkman:如果該消息包含任何不受信任的內容,則不適用。就像請求中的任何內容一樣;那會是一個XSS漏洞。 – 2013-10-01 12:00:15