我知道Django已经为设计师提供了一个很好的模板系统,但我想知道是否可以限制某些模板标签和过滤器的使用。
我们正在为设计人员构建一个Django插件,使模板开发更加开放,但我们希望隐藏django模板系统的一些逻辑,并向设计人员展示必要的内容。
在示例中:如何阻止使用{% load %}
模板标记并仅预加载我想要的标记?
答案 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进行进一步处理之前,要正确解析它。