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

Rob*_*ins 5 python google-app-engine

所以我用 GAE 完成了简单的“热身”应用程序。现在我想构建一些具有更复杂的目录结构的东西。大致如下:

siteroot/
    models/
    controllers/
        controller1/
        controller2/
        ...
    templates/
        template1/
        template2/
        ...
Run Code Online (Sandbox Code Playgroud)

..ETC。控制器将是处理请求的 Python 模块。然后,他们需要在关联的文件夹中找到(Django 样式)模板。我见过的大多数演示应用程序都像这样解析模板路径:

path = os.path.join(os.path.dirname(__file__), 'myPage.html')
Run Code Online (Sandbox Code Playgroud)

... __ 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")
Run Code Online (Sandbox Code Playgroud)

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

我假设任何硬编码都不会启动,因为这些应用程序驻留在谷歌的无限服务器场上。那么有什么更好的方法呢?

Nic*_*son 4

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

正确的解决方案是像您一样使用 os.path.split ,或者使用类似以下内容的内容:

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')
Run Code Online (Sandbox Code Playgroud)

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