TemplateDoesNotExist在python app-engine django 1.2上,而模板渲染绝对路径

时间:2011-09-08 19:23:23

标签: python django google-app-engine django-templates

由于App Engine警告

  

您使用的是默认的Django版本(0.96)。默认的Django版本将在不久的将来在App Engine版本中更改。请调用use_library()来显式选择Django版本。有关详细信息,请参阅http://code.google.com/appengine/docs/python/tools/libraries.html#Django

我在main.py

的顶部添加了两行代码
from google.appengine.dist import use_library
use_library("django", "1.2")

此代码完全破坏了我的应用程序引发此错误

File "/home/adel/Software/google_appengine/lib/django_1_2/django/template/loader.py", line 138, in find_template
raise TemplateDoesNotExist(name)
TemplateDoesNotExist: /home/adel/Workspace/jeeneo/site/Common/templates/en_US/template.html

我一直在谷歌搜索,发现Django不再支持相对路径类似问题的开发人员,在我的情况下,我使用绝对路径,我的代码是这样构造的

site/
    Frontpage/
        template/en_US/index.html
        index.py
    Events/
        template/en_US/event.html
        template/en_US/create.html
        event.py
        create.py
    Common/
        template/en_US/template.html
        template.py

每个类固有的Template类都是这样的

from Common import Template
class Event(Template):
    def get(self):

然后致电

self.render(__file__, "event.html")

要渲染HTML文件,渲染函数内置

def render(self, path, html):
    self.base = self.get_base()
    email = None
    if self.user:
        self.auth_url = users.create_logout_url("/")
        email = self.user.email
    else:
        self.auth_url = users.create_login_url(self.request.uri)

    self.template.update({
        "base": self.base,
        "user": self.user,
        "lang": self.lang,
        "template_html" : os.path.join(os.path.dirname(__file__), "templates/%s/template.html" % self.lang),
        "email": email,
        "auth_url": self.auth_url
    })

    html = os.path.join(os.path.dirname(path), "templates/%s/%s" % (self.lang, html))
    self.template.update(self.data)
    self.response.out.write(template.render(html, self.template))

html文件(event.html)有这段代码

{% extends template_html %}

我脑子里有两个解决方案,也许重组所有内容并将所有模板放在一个文件夹中,或者在App Engine上安装Django 0.96 ......但我很确定必须有一个更简单的解决方案。

1 个答案:

答案 0 :(得分:1)

我有一些类似的问题,我在这里描述了一些修复:

App engine default Django version change

当您使用应用引擎的template.render时,它会将TEMPLATE_DIRS设置为您要呈现的模板的目录。 Django 1.2中的extends标记检查包含的模板是否在TEMPLATE_DIRS目录中。如果它们位于父(或兄弟)目录中,则它会失败。

我发现的解决方案是不使用app引擎template.render,而是使用Django的Template类编写自己的解决方案。然后我还必须将TEMPLATE_DIRS设置为项目目录的根目录。

这是我记忆中1.4.2的情况,当我第一次看到这个时 - 行为可能已经改变了(虽然我的解决方法仍然可以正常工作)。