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

时间:2011-02-19 11:54:27

标签: python google-app-engine path

我在GAE Python应用程序中使用Jinja2模板。实际上,一个项目中有一些小应用程序。例如,他们是博客和网站。所以,第一个用于博客,第二个用于site =)。我有这个文件夹结构:

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

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

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

当然,它不起作用,因为它错了。它返回一个这样的字符串:     碱/数据/家/应用/所有MyApplication / 1.348460209502075158 /应用/项目/模板/项目

我需要它返回一个这样的字符串:     基地/数据/家/应用/所有MyApplication / 1.348460209502075158 /应用/模板/项目 我怎样才能使用绝对路径,而不是相对路径呢?我想我需要以某种方式获得我整个GAE项目的根源。 谢谢!

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:1)

为什么不在文件

周围加上os.path.abspath
template_dirs.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates/project'))

答案 2 :(得分:1)

这是一种kludge,我没有用我写下我的大部分代码的爱和关怀来写这个,但也许这对你有用...

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相同。

此外,这假设了谷歌在生产服务器上使用的目录结构,所以他们完全有可能改变一些东西并打破这个。