Как получить корневой путь приложения в GAE - PullRequest
5 голосов
/ 19 февраля 2011

Я использую шаблоны 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 ]

14 голосов
/ 21 февраля 2011

Самый простой способ получить корневой путь вашего приложения - это поместить модуль в корневой каталог вашего приложения, в котором хранится результат os.path.dirname(__file__), а затем импортировать его там, где это необходимо. Также можно вызвать os.path.dirname(module.__file__) в модуле, который находится в корне вашего приложения.

1 голос
/ 19 февраля 2011

Это своего рода клочок, и я не писал это с любовью и заботой, с которыми я пишу большую часть своего кода, но, возможно, это будет полезно для вас ...

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, корневой каталог вашего приложения ДОЛЖЕН иметь имя, совпадающее с идентификатором вашего приложения.

Кроме того, здесь делаются предположения о структуре каталогов, используемой Google на производственных серверах, поэтому вполне возможно, что они могут что-то изменить и сломать.

1 голос
/ 19 февраля 2011

Почему бы не поместить файл os.path.abspath в файл

template_dirs.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates/project'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...