运行`foreman start` /将Django应用程序部署到Heroku的问题

时间:2013-10-15 21:22:11

标签: django heroku directory-structure foreman procfile

这就是我的目录结构(我只包括相关部分):

my_git_root/
├── Procfile
├── README.md
├── requirements.txt
└── my_django_project
    ├── app1
    │   ├── admin.py
    │   ├── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    ├── fabfile.py
    ├── app2
    │   ├── __init__.py
    │   ├── models.py
    │   ├── templates
    │   ├── tests.py
    │   └── views.py
    ├── manage.py
    └── my_django_project
        ├── __init__.py
        ├── settings
        │   ├── base.py
        │   ├── __init__.py
        │   ├── local.py
        │   ├── production.py
        │   └── staging.py
        ├── static
        ├── urls.py
        └── wsgi.py

关注official Heroku docs,这是我Procfile中的内容:

web: gunicorn my_django_project.wsgi

但是当我运行foreman start命令时,我得到一个以ImportError: No module named my_django_project.wsgi.结尾的长回溯。

Procfilegit_root/移到my_django_project/(Django项目根目录)似乎有效(就像在this post中所做的那样),但只在本地 - 尝试在尝试扩展Web进程之前,部署到Heroku似乎没问题:

$ heroku ps:scale web=1
Scaling web dynos... failed 
 !    No such process type web defined in Procfile. 

看起来好像Heroku wants you to put the Procfile in the project's git repository root,但我在Procfile中尝试了很多组合,但似乎都没有。我也试过了:

web: gunicorn my_django_project/my_django_project.wsgi
Procfile中的

,但会产生ImportError: Import by filename is not supported.

指定python路径也不起作用;即。

web: gunicorn my_django_project.wsgi:application --pythonpath=/app/my_django_project

抛出错误ImportError: No module named my_django_project.wsgi

但是,使用git_root/my_django_project/的gunicorn在本地运行似乎有效:

$ gunicorn -b 0.0.0.0:8000 my_django_project.wsgi:application            
2013-10-15 16:55:31 [5703] [INFO] Starting gunicorn 18.0
2013-10-15 16:55:31 [5703] [INFO] Listening at: http://0.0.0.0:8000 (5703)
2013-10-15 16:55:31 [5703] [INFO] Using worker: sync
2013-10-15 16:55:31 [5708] [INFO] Booting worker with pid: 5708
2013-10-15 16:56:04 [5703] [INFO] Handling signal: winch
2013-10-15 16:56:04 [5703] [INFO] SIGWINCH ignored. Not daemonized

所以我的猜测是Procfile中的语法不正确,但我不确定如何。

2 个答案:

答案 0 :(得分:7)

在写这个问题时想出来了!

我必须做的是设置--pythonpath选项以指向我的django项目根目录,即git_root/my_django_project/

这就是我在Procfile中所拥有的:

web: gunicorn -b 0.0.0.0:8000 --pythonpath=./my_django_project my_django_project.wsgi:application

现在它在本地工作:

$ foreman start
17:04:02 web.1  | started with pid 6327
17:04:02 web.1  | 2013-10-15 17:04:02 [6330] [INFO] Starting gunicorn 18.0
17:04:02 web.1  | 2013-10-15 17:04:02 [6330] [INFO] Listening at: http://0.0.0.0:8000 (6330)
17:04:02 web.1  | 2013-10-15 17:04:02 [6330] [INFO] Using worker: sync
17:04:02 web.1  | 2013-10-15 17:04:02 [6335] [INFO] Booting worker with pid: 6335
17:04:04 web.1  | 2013-10-15 17:04:04 [6330] [INFO] Handling signal: winch
17:04:04 web.1  | 2013-10-15 17:04:04 [6330] [INFO] SIGWINCH ignored. Not daemonized

现在,扩展Web流程也可以正常工作:

$ heroku ps:scale web=1 --app my-django-project                          
Scaling web dynos... done, now running 1

答案 1 :(得分:0)

使用您的第一个脚手架,其中您的Procfile与my_django_project处于同一级别。我这样做了:

  

web:cd my_django_project&& gunicorn my_django_project.wsgi   --log-file -

希望这有帮助。

- 编辑 -

最好用下面的行改变这个文件。确保你在你的主分支上(我努力从另一个分支推进heroku)。

  

web:gunicorn --pythonpath my_django_project my_django_project.wsgi --log-file -