【问题标题】:how to stop django template code from escaping如何阻止 django 模板代码转义
【发布时间】:2013-08-20 22:17:50
【问题描述】:

在视图代码中渲染模板(例如电子邮件)时,有什么方法可以完全关闭 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...

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    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

    【讨论】:

    • 这是一个很好的解决方案,但需要对客户电子邮件进行大量编辑。
    • @GuyBowden 是的,谢谢,我实际上更喜欢在那里做我应该做的工作——例如,在模板中使用autoescapesafe。模板处理演示,嗯?
    【解决方案2】:

    全局禁用它通常是个坏主意,因为您很容易忘记它。我建议使用模板标签来禁用模板的该部分。

    类似这样的:

    {% autoescape off %}
        This will not be auto-escaped: {{ data }}.
    
        Nor this: {{ other_data }}
        {% autoescape on %}
            Auto-escaping applies again: {{ name }}
        {% endautoescape %}
    {% endautoescape %}
    

    【讨论】:

      【解决方案3】:

      使用 Django 的自动转义标签:

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

      有关更多信息,请查看文档here

      【讨论】:

        【解决方案4】:

        这是未经测试的,但根据源代码审查,上下文对象似乎可以将 autoescape 作为键。

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

        也就是说,这是一个相当彻底的变化。如果您知道模板可能正在寻找什么值,最好对这些值使用mark_safe 并传入预定义的选项。这将具有额外的好处,即不会冒客户端模板调用对客户有副作用的方法的可能性。第一次有人写模板并输入{{ customer.delete }},你就有问题了。

        【讨论】:

          【解决方案5】:

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

          这就是我所做的:

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

          【讨论】:

          • 那么email.subject 本身就是一个模板的字符串表示形式?
          • 是的 - 我最初的编辑暗示了这一点。客户在管理员中创建带有主题和正文的电子邮件(并且已经创建了很多)-因此不想改变它们的创建方式。
          • 在这种情况下应该可以工作,除非email.subject 使用{% extends %} 标记从另一个模板继承。这可能不太可能发生。
          猜你喜欢
          • 2017-04-05
          • 2013-10-19
          • 2012-02-05
          • 1970-01-01
          • 2011-09-14
          • 1970-01-01
          • 2012-07-03
          • 1970-01-01
          相关资源
          最近更新 更多