如何解决 Django Channels Heroku 应用程序中的“WebSocket 握手期间出错:意外响应代码:503”错误?

How to resolve “Error during WebSocket handshake: Unexpected response code: 503” error in a Django Channels Heroku app?

控制台中的错误:

  app.e05f6d1a6569.js:105 WebSocket connection to 'wss://domecode.com/wss?session_key=${sessionKey}' failed: Error during WebSocket handshake: Unexpected response code: 503
    (anonymous) @ app.e05f6d1a6569.js:105
    mightThrow @ jquery.js:3762
    process @ jquery.js:3830

我是 运行 Heroku 上使用 Daphne 的 Django Channels 应用程序(消息应用程序)。本题对应的所有文件都包含在本题中

routing.py - 消息应用程序

from messaging import consumers
from django.urls import re_path

websocket_urlpatterns = [
    re_path(r'^ws$', consumers.ChatConsumer),
]

app.js - 截取了 app.js 文件的 websocket 部分

var ws_scheme = window.location.protocol == 'https:' ? 'wss' : 'ws';
var socket = new WebSocket(ws_scheme + '://' + window.location.host + '/' + ws_scheme + '?session_key=${sessionKey}');

asgi.py - 项目的 asgi

import os
import django
# from django.core.asgi import get_asgi_application
from channels.routing import get_default_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'domecode.settings')
django.setup()  # to deploy with asgi when using channels
application = get_default_application() 

过程文件

release: python3 manage.py makemigrations && python3 manage.py migrate
web: daphne domecode.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python3 manage.py runworker channel_layer -v2 

CHANNEL_LAYERS 的 Django 设置片段 - REDIS_URL 是 Heroku 中的一个环境变量。

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [config('REDIS_URL')],
        },
    },
}

这里有什么问题的信息吗?

旁注:它在开发服务器中工作得很好,但是它在生产服务器 https://domecode.com/chat/.

中给出了顶部提到的错误

当我在生产服务器上发送消息时,它在控制台中出现错误,除非我重新加载页面,否则我看不到已发送的消息。我试过到处寻找类似的问题,但 none 的问题得到了适合我的回答。

Procfile 的更改、消息应用程序的 routing.py 以及一些小的更改,例如在 Heroku 上激活 worker dyno 对我有用。

Procfile 应更改为:

release: python3 manage.py makemigrations && python3 manage.py migrate
web: daphne domecode.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python3 manage.py runworker channels --settings=domecode.settings -v2

和Routing.py到:

from messaging import consumers
from django.urls import re_path

websocket_urlpatterns = [
    re_path(r'^ws$', consumers.ChatConsumer),
]