Возможно ли иметь Procfile и файл manage.py на другом уровне папки?

Введение:

  • Я следую краткому руководству Начало работы с Django на Heroku.

  • Я намерен применить философию книги Two Scoops of Django о работе с виртуальными средами и проектами. Одри Рой и Дэниел Гринфельд (авторы) предпочитают размещать все среды в одном каталоге, а все проекты — в другом.

  • Я также намерен применить философию книги Two Scoops of Django о размещении того, что сгенерировано командой управления django-admin.py startproject, внутри другого каталога, который служит корнем репозитория git (он же трехуровневый подход).

Оформление на высшем уровне:

repository_root/
    django_project_root/
        configuration_root/


Локально:

OS X 10.8.4
pip==1.4.1
virtualenv==1.10.1
virtualenvwrapper==4.1.1
wsgiref==0.1.2
.bashrc содержит:

export WORKON_HOME=$HOME/Envs
export PROJECT_HOME=$HOME/Projects

~/окружения
~/проекты


Внутри hellodjango_venv:

Django==1.5.2
dj-database-url==0.2.2
dj-static==0.0.5
django-toolbelt==0.0.1
gunicorn==18.0
> psycopg2==2.5.1
статический==0.4


Из терминала:

mac-pol:~ oubiga$ mkdir -p Projects/hellodjango_rep/hellodjango
mac-pol:~ oubiga$ cd Projects/hellodjango_rep/hellodjango
mac-pol:hellodjango oubiga$ mkvirtualenv hellodjango_venv
New python executable in hellodjango_venv/bin/python2.7
Also creating executable in hellodjango_venv/bin/python
Installing Setuptools..................................

...

..................................................done.
(hellodjango_venv)mac-pol:hellodjango oubiga$ pip install django-toolbelt

...

Successfully installed django-toolbelt django psycopg2 gunicorn dj-database-url dj-static static
Cleaning up...
(hellodjango_venv)mac-pol:hellodjango oubiga$ django-admin.py startproject hellodjango .
(hellodjango_venv)mac-pol:hellodjango oubiga$ touch Procfile && open Procfile

Изменить Procfile:

web: gunicorn hellodjango.wsgi

Запустите процесс:

(hellodjango_venv)mac-pol:hellodjango oubiga$ foreman start
01:30:37 web.1  | started with pid 638
01:30:37 web.1  | 2013-09-04 01:30:37 [638] [INFO] Starting gunicorn 18.0
01:30:37 web.1  | 2013-09-04 01:30:37 [638] [INFO] Listening at: http://0.0.0.0:5000 (638)
01:30:37 web.1  | 2013-09-04 01:30:37 [638] [INFO] Using worker: sync
01:30:37 web.1  | 2013-09-04 01:30:37 [641] [INFO] Booting worker with pid: 641
CTRL+C

Пока все хорошо.

На данный момент мое дерево проектов:

~/Projects/    
    hellodjango_rep/
        hellodjango/ cwd
            manage.py
            Procfile
            hellodjango/
                __init__.py
                settings/
                urls.py
                wsgi.py

и мое дерево Virtualenvs:

~/Envs/
    get_env_details
    initialize
    postactivate
    postdeactivate
    postmkproject
    postmkvirtualenv
    postrmproject
    postrmvirtualenv
    preactivate
    predeactivate
    premkproject
    premkvirtualenv
    prermproject
    prermvirtualenv
    hellodjango_venv/
        bin/
        include/
        lib/

Но помните ли вы трехуровневый подход? Как этого добиться?

Я совершенно уверен, что hellodjango_rep/ позже будет содержать как минимум: .git, .gitignore и requirements.txt


Исследования:

На IRC-канале #django Джейкоб Каплан-Мосс ответил:

... Procfile должен находиться на верхнем уровне вашего репозитория git...

Нил Миддлтон, инженер Heroku, ответил на вопрос «Procfile объявляет типы -> (нет) в Heroku» в SO:

... ваш Procfile должен находиться в корневом каталоге вашего репозитория git, который был отправлен в Heroku...

Из Центра разработки Heroku:

... Типы процессов объявляются через файл с именем Procfile, размещенный в корневом каталоге вашего приложения...


Первая попытка:

Я перемещаю Procfile на один уровень вверх по папке.

(hellodjango_venv)mac-pol:hellodjango oubiga$ cd ..

На данный момент мое дерево проектов:

~/Projects/    
    hellodjango_rep/ cwd
        Procfile
        hellodjango/
            manage.py
            hellodjango/
                __init__.py
                settings/
                urls.py
                wsgi.py

Я снова запускаю процесс:

(hellodjango_venv)mac-pol:hellodjango_rep oubiga$ foreman start

Я получаю ImportError: No module named hellodjango.wsgi


Отладка:

Ошибка ImportError, кажется, исходит от /Users/oubiga/Envs/hellodjango_venv/lib/python2.7/site-packages/gunicorn/util.py

def import_app(module):
    parts = module.split(":", 1)
    if len(parts) == 1:
        module, obj = module, "application"
    else:
        module, obj = parts[0], parts[1]

    try:
        __import__(module)  # <-- line 354
    except ImportError:
        if module.endswith(".py") and os.path.exists(module):
            raise ImportError("Failed to find application, did "
                "you mean '%s:%s'?" % (module.rsplit(".", 1)[0], obj))
        else:
            raise

...

Нет модуля с именем hellodjango.wsgi


Вторая попытка:

Procfile возвращается на прежний уровень. Procfile и manage.py снова связаны друг с другом.

(hellodjango_venv)mac-pol:hellodjango_rep oubiga$ foreman start

Я достану ERROR: Procfile does not exist. Совершенно очевидно, почему это происходит.


Гипотеза:

Из документации Джанго:

...manage.py автоматически создается в каждом проекте Django. manage.py — это тонкая оболочка вокруг django-admin.py, которая позаботится о двух вещах перед делегированием django-admin.py:
— помещает пакет вашего проекта в sys.path.
— устанавливает переменная среды DJANGO_SETTINGS_MODULE, чтобы она указывала на файл settings.py вашего проекта...

Я не уверен, что проблема связана с этим.


Итак:

Возможно ли иметь Procfile и файл manage.py в разных папках?
Что не так с этим подходом?


Заранее спасибо.


person oubiga    schedule 04.09.2013    source источник
comment
Я знаю, что слишком поздно. Вам не нужно ничего менять. Поместите procfile на верхний уровень. и запустите gunicorn --chdir hellodjango hellodjango.wsgi. Это будет работать. Спасибо   -  person Shah    schedule 15.09.2014


Ответы (2)


Во-первых, я должен сказать, что я не проводил столь широких исследований и использовал Heroku примерно 3 раза. Но:

(Ваша вторая попытка):

Procfile действительно должен находиться в каталоге верхнего уровня. Если вы переместите Procfile глубже, gunicorn не сможет его найти.

(Ваша первая попытка):

И имея свой Procfile в каталоге верхнего уровня, вы должны указать путь к wsgi. Что пока невозможно. Таким образом, вы должны создать файл __init__.py в первом каталоге "hellodjango", чтобы пометить его как "модуль". Затем вы должны изменить путь в Procfile на: hellodjango.hellodjango.wsgi

Надеюсь это поможет.

person darkless    schedule 04.09.2013

Я столкнулся с этим, используя макет Two Scoops, и мое решение состояло в том, чтобы сохранить стандартный макет (Procfile в repository_root, manage.py в project_root) и создать Procfile скрипт, который меняет каталог на project_root перед запуском gunicorn.

e.g., in Procfile:

web: sh -c 'cd ./mysite/ && exec gunicorn mysite.wsgi --log-file -'

С таким же успехом вы могли бы Procfile вызвать внешний скрипт:

web: bash scripts/heroku_run

Я предпочитаю это добавлению дополнительных путей к модулям, поскольку это может испортить импорт в settings.py и urls.py и т. д.

person sHtev    schedule 13.08.2014
comment
Спасибо! Это мне очень помогло, так как мне нравится размещать корень django на один уровень ниже корня репозитория :) - person avlnx; 25.03.2016