2010-01-12 93 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