我在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项目的根源。 谢谢!
答案 0 :(得分:14)
获取应用根路径的最简单方法是将模块放在应用的根目录中,该模块存储os.path.dirname(__file__)
的结果,然后根据需要导入。或者,在应用程序根目录中的模块上调用os.path.dirname(module.__file__)
。
答案 1 :(得分:1)
为什么不在文件
周围加上os.path.abspathtemplate_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相同。
此外,这假设了谷歌在生产服务器上使用的目录结构,所以他们完全有可能改变一些东西并打破这个。