运行“工头启动”/将 Django 应用程序部署到 Heroku 时出现问题
Posted
技术标签:
【中文标题】运行“工头启动”/将 Django 应用程序部署到 Heroku 时出现问题【英文标题】:Problems running `foreman start` / deploying Django app to Heroku 【发布时间】:2013-10-23 20:30:16 【问题描述】:这是我的目录结构的样子(我只包含了相关部分):
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.
结尾的长回溯。
将Procfile
从git_root/
移动到my_django_project/
(Django 项目根目录)似乎有效(就像在this post 中所做的那样),但仅限于本地——尝试部署到 Heroku 似乎没问题,直到您尝试扩展 Web 进程:
$ 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
中的语法不正确,但我不确定如何。
【问题讨论】:
【参考方案1】:在写这个问题的时候想通了!
我需要做的是设置--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
【讨论】:
如果我的 wsgi 文件位于根文件夹中,我将如何调整 Procfile 中的行?【参考方案2】:使用您的第一个脚手架,您的 Procfile 与 my_django_project 处于同一级别。我这样做了:
web: cd my_django_project && gunicorn my_django_project.wsgi --日志文件-
希望这会有所帮助。
--编辑--
最好用下面的行来改变这个文件。确保你在你的主分支上(我很难从另一个分支推送 heroku)。
web: gunicorn --pythonpath my_django_project my_django_project.wsgi --log-file -
【讨论】:
以上是关于运行“工头启动”/将 Django 应用程序部署到 Heroku 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
使用docker将django应用程序部署到heroku时在哪里运行collectstatic?
将 Cookiecutter-Django 应用程序部署到 Heroku 时出错
由于 PyWin32,无法将 Django 应用程序部署到 Heroku
将 Django 模型部署到网络服务器后,如何对其进行更改?