在Google App Engine中找到相对路径的好方法是什么?
因此,我使用GAE完成了一些琐碎的"热身"应用程序。现在,我想用更复杂的目录结构来构建某些东西。类似于以下内容:
siteroot/ models/ controllers/ controller1/ controller2/ ... templates/ template1/ template2/ ...
..等等。控制器将是处理请求的Python模块。然后,他们需要在关联的文件夹中找到(Django风格的)模板。我见过的大多数演示应用程序都可以解析以下模板路径:
path = os.path.join(os.path.dirname(__file__), 'myPage.html')
...__文件__属性解析为当前正在执行的脚本。因此,在上面的示例中,如果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的无限服务器场中。那么有什么更好的方法呢?
解决方案
回答
dirname函数返回绝对路径,使用相对路径。当使用os.path.abspath(os.path.curdir)
执行控制器时,查看当前目录是什么,并建立相对于该位置的模板的路径(当然没有os.path.abspath
部分) )。
仅当当前目录位于siteroot内时,此方法才起作用,否则我们可以执行以下操作:
template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
回答
我们不能使用Toni建议的相对路径,因为我们不能保证从工作目录到应用程序目录的路径将保持不变。
正确的解决方案是按原样使用os.path.split或者使用类似以下内容的方法:
path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')
我通常的方法是使用上述方法生成模板目录的路径,并将其存储为我的控制器对象的成员,并提供一个" getTemplatePath"方法,该方法采用提供的文件名并将其与基本名连接起来。