在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代码和模板分开。
我拼凑出来的解决方案感觉有点...不太优雅:
base_paths = os.path.split(os.path.dirname(__file__))
template_dir = os.path.join(base_paths[0], "templates")
所以,我只是把当前运行脚本的路径最后一个元素剪掉,然后把模板目录加到新的路径上。我看到的其他(非GAE特定的)解决Python路径的方法似乎都比较复杂(比如把路径拆分成列表然后进行相应的操作)。Django似乎有个解决方案,但我更想坚持使用GAE的API,而不是创建一个完整的Django应用并为GAE进行修改。
我假设任何硬编码的方式都不太可行,因为这些应用运行在谷歌的无限服务器农场上。那么,有什么更好的方法呢?
2 个回答
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”方法,这个方法接受提供的文件名,并将其与基本路径连接起来。