如何阻止django模板代码逃脱

时间:2013-08-20 22:17:50

标签: django django-templates

在视图代码中渲染模板时是否有任何方法可以完全关闭django auto_escaping(例如,对于电子邮件):

from django.template import Context, Template
subject_template_string = "Hi {{ customer.name }}"
subject_template = Template(subject)
context = Context({'customer':MyCustomerModel.objects.get(pk=1)})
subject = subject_template.render(context)

如果customer.name类似于“Jack& Jill” - 主题看起来像“Hi Jack& \ amp; Jill”(没有反斜杠!)

有类似

的东西
subject = subject_template.render(context, autoescape=False)

编辑:实际的模板是由数据库中的客户端创建的,我希望避免在可能发生这种情况的所有模板中添加|safe ...

5 个答案:

答案 0 :(得分:4)

如何使用mark_safe

  

将字符串明确标记为(HTML)输出目的是安全的。该   返回的对象可以在字符串或unicode对象的任何地方使用   合适的。

它将字符串标记为安全字符串,因此,您应该将customer.name取出并传递给模板:

from django.utils.safestring import mark_safe
customer = MyCustomerModel.objects.get(pk=1)
context = Context({'customer_name': mark_safe(customer.name)})
subject = subject_template.render(context)

虽然控制什么是安全的,但最好在模板内部进行,这就是为什么应该优先使用autoescape

答案 1 :(得分:2)

全局禁用它通常是一个坏主意,因为你很容易忘记它。我建议使用templatetag来为模板的那一部分禁用它。

这样的事情:

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

    Nor this: {{ other_data }}
    {% autoescape on %}
        Auto-escaping applies again: {{ name }}
    {% endautoescape %}
{% endautoescape %}

答案 2 :(得分:0)

使用Django的autoescape标签:

{% autoescape off %}
    {{ body }}
{% endautoescape %}

有关详细信息,请查看文档here

答案 3 :(得分:0)

这是未经测试的,但根据源代码审核,上下文对象可能会将autoescape作为关键字。

context = Context({'customer':MyCustomerModel.objects.get(pk=1), 'autoescape': False})
subject = subject_template.render(context)

那就是说,这是一个非常彻底的改变。如果您知道模板可能要查找的值,那么最好对这些值使用mark_safe并传入预定义的选项。这样做的另一个好处是不会冒客户端模板调用对客户产生副作用的方法的风险。第一次有人写模板并放入{{ customer.delete }}时,你就遇到了问题。

答案 4 :(得分:0)

刚回来用简单的解决方案回答我自己的问题,已经有4个答案了......谢谢。

这就是我的选择:

subject_template = Template(u'{%% autoescape off %%}%s{%% endautoescape %%}' % email.subject)