如何解决 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),
]
控制台中的错误:
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),
]