Какой хороший способ найти относительные пути в Google App Engine? - PullRequest
4 голосов
/ 15 сентября 2008

Итак, я сделал тривиальные прогревные приложения с помощью GAE. Теперь я хотел бы создать что-то с более сложной структурой каталогов. Что-то вроде:

siteroot/
    models/
    controllers/
        controller1/
        controller2/
        ...
    templates/
        template1/
        template2/
        ...

.. и т.д. Контроллерами будут модули Python, обрабатывающие запросы. Затем им нужно будет найти шаблоны (в стиле Django) в связанных папках. Большинство демонстрационных приложений, которые я видел, разрешают пути шаблона следующим образом:

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

... свойство __ file __ преобразуется в текущий выполняемый скрипт. Итак, в приведенном выше примере, если скрипт 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")

Итак, я просто отрываю последний элемент пути для текущего запущенного скрипта и добавляю каталог шаблонов к новому пути. Другие (не специфичные для GAE) решения, которые я видел для разрешения путей Python, кажутся довольно тяжеловесными (например, разбиение путей на списки и манипулирование соответствующим образом). У Django, кажется, есть ответ на этот вопрос, но я бы предпочел использовать API GAE вместо создания полноценного приложения Django и его модификации для GAE.

Я предполагаю, что что-либо жестко запрограммированное не было бы начальным, так как приложения живут на бесконечной ферме серверов Google. Так что же лучше?

Ответы [ 2 ]

4 голосов
/ 19 сентября 2008

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

Правильное решение - либо использовать os.path.split, как вы, либо использовать что-то вроде:

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

Мой обычный подход - сгенерировать путь к каталогу шаблонов, используя вышеуказанный метод, и сохранить его как член моего объекта контроллера, и предоставить метод "getTemplatePath", который берет предоставленное имя файла и соединяет его с базовым именем.

1 голос
/ 15 сентября 2008

Функция dirname возвращает абсолютный путь, используйте относительные пути. Посмотрите, что является текущим каталогом, когда ваши контроллеры выполняются с os.path.abspath(os.path.curdir), и постройте путь к шаблонам относительно этого места (без части os.path.abspath, конечно).

Это будет работать, только если текущий каталог находится где-то внутри siteroot , иначе вы можете сделать что-то вроде этого:

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...