Django包含模板问题,从0.96到1.2

时间:2011-02-28 15:46:14

标签: django

我使用谷歌应用引擎,在0.96我没有问题包括模板如下

{% include "../header.html" %}

然而,在1.2上面的代码不起作用??

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

原因是google.appengine.ext.webapp.template.render不使用任何用户可配置的TEMPLATE_DIRS。相反,它通过获取给定模板的目录并在TEMPLATE_DIRS使用它来发明自己的TEMPLATE_DIRS。这意味着如果您致电render("foo/bar/fie"),它将使用foo/bar作为您的模板目录,并从那里查找文件。

现在,从0.96到1.2的变化是文件查找从使用os.path.join切换到使用django.utils._os.safe_join,这不允许使用../从基本目录中转义。

我没有看到任何明显的方法。您似乎必须直接在模板目录中使用文件调用render,而不是在子目录中。

答案 1 :(得分:2)

dkagedal在对问题的评估中是正确的,但是如果你不反对monkeypatching,那么这是一个简单的解决方法:

try:
  # Bypass Django's safe_join for template paths since App Engine sandboxes the
  # filesystem anyway, and safe_join won't allow relative includes because
  # webapp.template always sets the template's parent directory as the "root",
  # rather than the app's real root directory.
  from django.utils import _os
  _os.safe_join = os.path.join
except ImportError:
  pass  # App is using a version of Django that doesn't use safe_join, it's OK.

答案 2 :(得分:0)

这似乎很奇怪,这不起作用 - 这是标签的正确语法......

它怎么不工作?根本没有引入数据?错误信息?

header.html是否只是常规html的正文部分?或者它是一个完整的独立HTML页面? (即它有html,head,body,tags等?还是只有h,p等?)

也许尝试使用此处记录的{%ssi%}标记: SSI Template Tag