在Google App Engine中查找相对路径的好方法是什么?

时间:2008-09-15 05:21:48

标签: python google-app-engine

所以我用GAE完成了琐碎的“热身”应用程序。现在我想用更复杂的目录结构构建一些东西。有点像:

siteroot/
    models/
    controllers/
        controller1/
        controller2/
        ...
    templates/
        template1/
        template2/
        ...

...等。控制器将是处理请求的Python模块。然后,他们需要在相关文件夹中找到(Django风格)模板。我见过的大多数演示应用都解决了这样的模板路径:

path = os.path.join(os.path.dirname(__file__), 'myPage.html')

... __ file __属性解析为当前正在执行的脚本。所以,在上面的例子中,如果一个Python脚本在controllers / controller1 /中运行,那么'myPage.html'将解析到同一个目录 - controllers / controller1 / myPage.html - 我宁愿干净地分开我的Python代码和模板。

我一起入侵的解决方案感觉...... hacky:

base_paths = os.path.split(os.path.dirname(__file__))
template_dir = os.path.join(base_paths[0], "templates")

所以,我只是剪掉当前正在运行的脚本的路径的最后一个元素,并将模板目录附加到新路径。我见过的用于解析Python路径的其他(非GAE特定的)解决方案似乎非常重量级(例如将路径拆分为列表并相应地进行操作)。 Django似乎有一个答案,但我宁愿坚持GAE API,而不是创建一个完整的Django应用程序并为GAE修改它。

我假设任何硬编码都不是首发,因为应用程序存在于Google的无限服务器场。那么什么是更好的方式?

2 个答案:

答案 0 :(得分:4)

您不能像Toni建议的那样使用相对路径,因为您无法保证从工作目录到应用程序目录的路径将保持不变。

正确的解决方案是使用os.path.split,或者使用类似的东西:

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')

我通常的方法是使用上面的方法生成模板目录的路径,并将其存储为我的控制器对象的成员,并提供一个“getTemplatePath”方法,该方法获取提供的文件名并将其与基本名称连接。

答案 1 :(得分:1)

dirname函数返回绝对路径,使用相对路径。查看使用os.path.abspath(os.path.curdir)执行控制器时的当前目录是什么,并构建相对于该位置的模板路径(当然没有os.path.abspath部分)。

这只有在当前目录位于 siteroot 内的某个位置时才有效,否则你可以这样做:

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")