Введение:
Я следую краткому руководству Начало работы с 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 в разных папках?
Что не так с этим подходом?
Заранее спасибо.
procfile
на верхний уровень. и запуститеgunicorn --chdir hellodjango hellodjango.wsgi
. Это будет работать. Спасибо - person Shah   schedule 15.09.2014