如何在GAE中获取应用程序根路径

5

我正在使用Jinja2模板来开发我的GAE Python应用程序。实际上,在一个项目中有几个小应用程序。例如,博客和网站。因此,第一个应用程序是博客,第二个应用程序是网站 =)。我的文件夹结构如下:

/
  /apps
    /blog
    /site
/templates
  /blog
  /site

我还有一个用于访问每个应用程序模板文件夹的代码。它看起来像这样:

template_dirs = []
template_dirs.append(os.path.join(os.path.dirname(__file__), 'templates/project'))

当然,这样是行不通的。它返回一个字符串,如下所示: base/data/home/apps/myapplication/1.348460209502075158/apps/project/templates/project
我需要它返回这样的字符串: base/data/home/apps/myapplication/1.348460209502075158/apps/templates/project
如何使用绝对路径而非相对路径来实现呢?我想我需要以某种方式获取整个GAE项目的根目录。 谢谢!
3个回答

15

获取应用程序的根路径最简单的方法是将一个模块放在应用程序的根目录中,该模块保存 os.path.dirname(__file__) 的结果,然后在需要的地方导入它。或者,在一个位于应用程序根目录中的模块上调用 os.path.dirname(module.__file__)


1
现在它运行良好。谢谢!我纠正的唯一一件事是os.path.dirname(file),而不是os.dirname(file)。 - Sergei Basharov

1
为什么不在文件周围加上os.path.abspath?
template_dirs.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates/project'))

有可能某一天包含某个应用程序的文件夹会移动到另一个位置,我希望在这种情况下它能正常工作,而不需要手动更改路径。 - Sergei Basharov
我假设这是Django,你的settings.py不会位于appengine应用程序根目录中吗? - Tom Willis
不,我不使用Django,这只是一个Web应用程序。我以为这是一个简单的问题——如何在GAE中获取我的应用程序的根目录=)。奇怪的是,我们没有看到一个简单的解决方案。无论如何,还是谢谢。 - Sergei Basharov
好的,我通常通过约定这样做,即由app.yaml调用的脚本(必须位于根目录中)是app.py,在那里初始化全局设置,例如我的模板路径。或者将模板放在应用程序中,那么您就不需要知道应用程序的根目录了。 :) - Tom Willis

1

这有点像一个临时解决方案,我没有像写大多数代码那样充满爱和关怀地编写它,但也许对你有用...

import os
def app_root():
    """Get the path to the application's root directory."""
    app_id = os.environ['APPLICATION_ID']
    path = os.environ['PATH_TRANSLATED']
    path_parts = path.split(app_id, 1)
    root_path = path_parts[0] + app_id
    # If this is ran on Google's servers, there is an extra dir
    # that needs to be traversed to get to the root
    if not os.environ['SERVER_SOFTWARE'].startswith('Dev'):
        root_path += '/' + path_parts[1].lstrip('/').split('/', 1)[0]
    return root_path

请注意,为了使SDK正常工作,您的应用程序根目录必须与您的应用程序ID相同。
此外,这假设了Google在生产服务器上使用的目录结构,因此他们完全有可能更改某些内容并破坏此功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接