如何全局禁用 Django 模板的自动转义?

Posted

技术标签:

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

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

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

django.utils.safestring.mark_safe safe filter autoescape tag autoescape constructor argument of Context

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

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

但它似乎对我不起作用。

小例子:

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

【问题讨论】:

【参考方案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() 不适用于字典。

以上是关于如何全局禁用 Django 模板的自动转义?的主要内容,如果未能解决你的问题,请参考以下文章

关闭Django模板的自动转义

Django 模板:启用模板自动转义后,我是不是需要将 URL 传递给 URLEncode?

如何防止 Django 基本内联自动转义

Twig扩展禁用自动转义

如何正确应用 django/jinja2 模板过滤器“转义”和“换行符”?

如何在 django 模板中从 for 循环中转义一行