python app-engine django 1.2上的TemplateDoesNotExist,同时模板呈现绝对路径

Posted

技术标签:

【中文标题】python app-engine django 1.2上的TemplateDoesNotExist,同时模板呈现绝对路径【英文标题】:TemplateDoesNotExist on python app-engine django 1.2 while template rendering absolute paths 【发布时间】:2011-11-13 06:41:58 【问题描述】:

由于 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...但我很确定一定有一个更简单的解决方案。

【问题讨论】:

请包含所有相关代码(例如,整个Template类),而不仅仅是一行sn-ps。 另外,它声称模板不存在的路径是否有效? @Nick 我已经附上了完整的渲染功能。 @Nick adel@adel-laptop:~/Software/google_appengine$ 文件 /home/adel/Workspace/jeeneo/site/Common/templates/en_US/template.html /home/adel/Workspace/ jeeneo/site/Common/templates/en_US/template.html:HTML 文档文本 【参考方案1】:

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

App engine default Django version change

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

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

这是我在 1.4.2 中的记忆,当我第一次研究这个时 - 行为可能已经改变(尽管我的解决方法仍然可以正常工作)。

【讨论】:

谢谢,我会在几个小时内尝试您的解决方案并报告。

以上是关于python app-engine django 1.2上的TemplateDoesNotExist,同时模板呈现绝对路径的主要内容,如果未能解决你的问题,请参考以下文章

如何从本地 Google App-engine 数据存储中删除所有实体?

App-Engine (Java) 文件上传

HTTP ERROR: 503 当我在本地运行 app-engine

从 app-Engine 上的 java 类向 Android 客户端发送 PUSH 通知

app-engine iOS 推送通知异常:“指定的队列未知”

在 Android 的 Google App-Engine 中使用 RPC 代理类多次写入(实体)