2008-09-15 61 views
3

所以我用GAE做了简单的“热身”应用程序。现在我想用更复杂的目录结构来构建一些东西。沿线的东西:在Google App Engine中寻找相对路径的好方法是什么?

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代码和模板。

我砍死在一起的解决方案感到...哈克:

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的无限服务器场中。那么更好的方法是什么?

回答

4

不能使用相对路径,如托尼建议,因为你没有保证从工作目录到应用程序目录的路径将保持不变。

正确的解决方法是使用os.path.split这样的,因为你,或者使用类似:

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

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

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") 
相关问题