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

时间:2019-03-25 18:01:46

标签: python django python-3.x

我在非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 <FooBar>.

实际输出:
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 个答案:

答案 0 :(得分:0)

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

docker exec $container_name psql --username=$database_user_name --dbname=$database_name --command="SELECT 1;" > /dev/null

如您所见,增加的好处包括from django.template import engines template = engines['django'].from_string("My name is {{ my_name }}.") context = {"my_name": "<FooBar>"} print(template.render(context)) 方法和直接传递字典而不是创建Context实例的功能。