Heroku 与 django 通道的正确 procfile/要求是什么?

2024-05-16

tl;dr - django 频道应用程序在本地使用 manage.py runserver 运行,但不在 heroku 上运行。

我是 django 通道的新手 - 尝试使用 heroku 通道部署一个非常基本的 django 应用程序。我最初使用标准构建了该项目Django 民意调查教程 https://docs.djangoproject.com/en/3.0/intro/tutorial01/并将其部署到heroku。然后我使用以下命令添加了聊天应用程序Django 频道教程 https://channels.readthedocs.io/en/latest/tutorial/part_1.html。设法使用 docker 按照他们的建议运行 redis 服务器并在本地正常运行“python manage.py runserver”。

我在尝试将其部署到heroku 或使用heroku local 在本地运行时遇到了困难。我已经在heroku中添加了redis插件,并修改了settings.py以指向REDIS_URL环境变量。我还修改了我的模板以在适当的情况下使用 wss (我相信这对于 heroku 是必要的):

var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
        var target = ws_scheme + '://'
        + window.location.host
        + '/ws/chat/'
        + roomName
        + '/';
        const chatSocket = new WebSocket(
          target
        );
...

因此我得出的结论是问题出在 procfile 上。我不确定那里有什么使用说明。最初的民意调查教程使用:

web: gunicorn gettingstarted.wsgi --log-file -

如果我只是使用“heroku local”工作正常并且部署工作正常,但是当我尝试发送聊天消息时,它什么也不做,并在控制台中显示 404。我知道我必须更改它以使用 asgi 服务器而不是gunicorn。成立本教程 https://github.com/jacobian/channels-example在部署一个带有 Heroku 通道的应用程序时,它使用了:

web: daphne chat.asgi:channel_layer --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker -v2

我尝试过,但这就是我陷入困境的地方。这是我运行 heroku local 时得到的结果:

krishnas-air:python-getting-started Krishna$ heroku local
[OKAY] Loaded ENV .env File as KEY=VALUE Format
6:46:50 PM worker.1 |  Traceback (most recent call last):
6:46:50 PM worker.1 |    File "manage.py", line 8, in <module>
6:46:50 PM worker.1 |      from django.core.management import execute_from_command_line
6:46:50 PM worker.1 |  ImportError: No module named django.core.management
[DONE] Killing all processes with signal  SIGINT
6:46:50 PM worker.1 Exited with exit code null
6:46:50 PM web.1    |  Traceback (most recent call last):
6:46:50 PM web.1    |    File "/usr/local/bin/daphne", line 5, in <module>
6:46:50 PM web.1    |      from daphne.cli import CommandLineInterface
6:46:50 PM web.1    |    File "/usr/local/lib/python3.7/site-packages/daphne/cli.py", line 1, in <module>
6:46:50 PM web.1    |      import argparse
6:46:50 PM web.1    |    File "<frozen importlib._bootstrap>", line 983, in _find_and_load
6:46:50 PM web.1    |    File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
6:46:50 PM web.1    |    File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
6:46:50 PM web.1    |    File "<frozen importlib._bootstrap_external>", line 724, in exec_module
6:46:50 PM web.1    |    File "<frozen importlib._bootstrap_external>", line 857, in get_code
6:46:50 PM web.1    |    File "<frozen importlib._bootstrap_external>", line 525, in _compile_bytecode
6:46:50 PM web.1    |  KeyboardInterrupt
6:46:50 PM web.1    Exited with exit code null

导入错误消息让我认为我的 requests.txt 可能缺少某些内容,因此我也将其包含在此处以供参考:

django
gunicorn
django-heroku
requests
channels
channels_redis
asgi_redis
asgiref
daphne
redis
gevent
gevent-websocket
greenlet

谢谢你的帮助!


我刚刚发现一个非常相似的问题。首先,虽然不是 Heroku 特有的,但这些docs https://channels.readthedocs.io/en/latest/deploying.html是必读的。

我认为问题在于 Heroku 正在路由ws://通过 WSGI 而不是 ASGI 发出请求。所以第一步是创建一个asgi.py文件位于同一文件夹中wsgi.py像这样的东西:

import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dropdjango.settings")
django.setup()
application = get_default_application()

然后,在 Procfile 中,定义 dynosweb worker:

web: daphne <my-web-app>.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker channel_layer -v2

如果 Heroku 中尚不存在测功机,请使用 Heroku CLI 创建它们。 就我而言,webdyno 已经存在所以我只创建了worker dyno:

heroku ps:scale worker=1:free -a <your-heroku-app-name>

最后,仔细检查你的settings.py确保您拥有:

ASGI_APPLICATION="<my-web-app>.routing.application"
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [os.environ.get("REDIS_URL", "redis://localhost:6379")]},
    },
}

警告:这将通过 daphne 运行您的所有请求。我读过一些警告,但我还没有经历过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Heroku 与 django 通道的正确 procfile/要求是什么? 的相关文章

随机推荐