如何全局禁用 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 &lt;FooBar&gt;.
实际输出:My name is &lt;FooBar&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,以便示例打印&lt;FooBar&gt;
而不是 &lt;FooBar&gt;
? mark_safe()
不适用于字典。以上是关于如何全局禁用 Django 模板的自动转义?的主要内容,如果未能解决你的问题,请参考以下文章
Django 模板:启用模板自动转义后,我是不是需要将 URL 传递给 URLEncode?