【问题标题】:How to globally disable autoescape of Django templates?如何全局禁用 Django 模板的自动转义?
【发布时间】:2019-08-16 01:22:43
【问题描述】:

我在非 HTML 环境中使用 Django 模板,所以我自然想关闭 HTML 自动转义。
如何在全局级别将其关闭?

我知道在本地禁止自动转义的选项过多:

这些选项抑制全局启用的自动转义,在我的用例中,我希望相反。

根据docs,DjangoTemplates 后端应该有一个“自动转义”选项。
我什至找到了添加它的feature requestcommit

但它似乎对我不起作用。

小例子:

from django.template import Context
from django.template import Template
import django
from django.conf import settings

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "OPTIONS":
            {
            "autoescape": False
            }
    }
]
settings.configure(TEMPLATES=TEMPLATES)
django.setup()

template = Template("My name is {{ my_name }}.")
context = Context({"my_name": "<FooBar>"})
print(template.render(context))

预期输出:
My name is &amp;lt;FooBar&amp;gt;.

实际输出:
My name is &amp;lt;FooBar&amp;gt;.

我可能错过了一些愚蠢的东西。 有人可以启发我吗?

我的虚拟环境:

python==3.6.5  
Django==2.1.7  
pip==9.0.3  
pytz==2018.9  
setuptools==39.0.1

【问题讨论】:

    标签: python django python-3.x


    【解决方案1】:

    问题是直接从 Template 类创建的模板没有考虑任何设置。为此,您需要通过引擎获取模板。这会起作用:

    from django.template import engines
    template = engines['django'].from_string("My name is {{ my_name }}.")
    context = {"my_name": "<FooBar>"}
    print(template.render(context))
    

    如您所见,额外的好处包括from_string 方法和直接传递字典而不是创建上下文实例的能力。

    【讨论】:

    • 如何将上下文变量标记为 SafeString,以便示例打印 &amp;lt;FooBar&amp;gt; 而不是 &amp;lt;FooBar&amp;gt;mark_safe() 不适用于字典。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2013-08-15
    • 2010-11-05
    • 2011-01-14
    相关资源
    最近更新 更多