有没有办法限制在Django模板中使用标签和过滤器?

时间:2014-02-19 15:05:43

标签: python django templates

我知道Django已经为设计师提供了一个很好的模板系统,但我想知道是否可以限制某些模板标签和过滤器的使用。

我们正在为设计人员构建一个Django插件,使模板开发更加开放,但我们希望隐藏django模板系统的一些逻辑,并向设计人员展示必要的内容。

在示例中:如何阻止使用{% load %}模板标记并仅预加载我想要的标记?

2 个答案:

答案 0 :(得分:3)

试试这个装饰者:Safe template decorator

来自作者描述:

  

限制模板可用的标签和过滤器的装饰器   在函数中加载和解析。

     

这主要是在授予用户权力时使用   DTL。你显然不希望用户能够做的事情   可能是恶意的。

     

例如,{%ssi%}标记可用于显示敏感信息   数据配置不当。

     

{%load%}使他们可以访问所有无限的python代码   在你的templatetags中写道。 {%load sudo%} {%sudo rm -rf /%} o_0

     

请注意,“load”标记(以及其他标记)未在默认值中列出   标签白名单。如果你在一个解析模板(但间接)   用这个装饰的功能,不公开的内置标签会表现得像   未定义的标签(即,它们将导致TemplateSyntaxError)。

     

由于{%load%}未列入白名单,因此您可能需要包含一些内容   为方便起见,自定义标签或过滤器为“builtins”。简单地说   库的模块路径包含在额外的kwarg或   extra_libraries列表。通常,不建议这样做   图书馆需要仔细和防御性地编程。

     

注意:这对清理渲染上下文没有任何作用!   这完全取决于你!这只是限制了什么标签和   模板中允许使用过滤器。

示例:

from django.template.loader import get_template
safe_get_template = use_safe_templates(get_template)
tmpl = safe_get_template('myapp/some_template.html')

from django.template import Template
use_safe_templates(Template)('{% load sudo %}')
# TemplateSyntaxError: Invalid block tag 'load'

答案 1 :(得分:2)

一种简单的方法是实现与template loader类似的自己的Django's file system loader并从文本中删除某些标记(假设您可以将事件转换为模板/模板节点,以便能够在将模板提供给Django进行进一步处理之前,要正确解析它。