Django и uvicorn выбрасывают ошибки `closing handshake failed` при загрузке страницы
Я пытаюсь следовать некоторым руководствам по настройке сервера Django на Heroku и добавить вебсокеты для передачи информации на и с моих внешних страниц. Я думаю, что все сделал правильно, однако я получаю следующие ошибки, когда мой websocket на странице пытается подключиться:
5:06:07 PM web.1 | [2021-10-26 21:06:07 +0000] [36593] [ERROR] Exception in ASGI application
5:06:07 PM web.1 | Traceback (most recent call last):
5:06:07 PM web.1 | File "/Users/bslaght/Library/Python/3.8/lib/python/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 203, in run_asgi
5:06:07 PM web.1 | result = await self.app(self.scope, self.asgi_receive, self.asgi_send)
5:06:07 PM web.1 | File "/Users/bslaght/Library/Python/3.8/lib/python/site-packages/uvicorn/middleware/proxy_headers.py", line 75, in __call__
5:06:07 PM web.1 | return await self.app(scope, receive, send)
5:06:07 PM web.1 | File "/Users/bslaght/Library/Python/3.8/lib/python/site-packages/channels/routing.py", line 74, in __call__
5:06:07 PM web.1 | raise ValueError(
5:06:07 PM web.1 | ValueError: No application configured for scope type 'websocket'
5:06:07 PM web.1 | [2021-10-26 21:06:07 +0000] [36593] [INFO] connection open
5:06:07 PM web.1 | [2021-10-26 21:06:07 +0000] [36593] [ERROR] closing handshake failed
5:06:07 PM web.1 | Traceback (most recent call last):
5:06:07 PM web.1 | File "/Users/bslaght/Library/Python/3.8/lib/python/site-packages/websockets/legacy/server.py", line 232, in handler
5:06:07 PM web.1 | await self.close()
5:06:07 PM web.1 | File "/Users/bslaght/Library/Python/3.8/lib/python/site-packages/websockets/legacy/protocol.py", line 779, in close
5:06:07 PM web.1 | await asyncio.shield(self.close_connection_task)
5:06:07 PM web.1 | File "/Users/bslaght/Library/Python/3.8/lib/python/site-packages/websockets/legacy/protocol.py", line 1309, in close_connection
5:06:07 PM web.1 | self.transport.write_eof()
5:06:07 PM web.1 | File "uvloop/handles/stream.pyx", line 696, in uvloop.loop.UVStream.write_eof
5:06:07 PM web.1 | File "uvloop/handles/handle.pyx", line 159, in uvloop.loop.UVHandle._ensure_alive
5:06:07 PM web.1 | RuntimeError: unable to perform operation on <TCPTransport closed=True reading=False 0x7fde634a6c30>; the handler is closed
Я пробовал искать эти ошибки везде, но безрезультатно. Я предполагаю, что у меня просто где-то не хватает файла. Это мой первый раз, когда я использую Heroku и Django. Вот другие соответствующие части моего приложения:
Страница:
<script language="javascript">
var prefix = (window.location.protocol == 'https:') ? 'wss://' : 'ws://';
var ws_url = prefix + window.location.host + '/ws/ticks/';
var chatSocket = new ReconnectingWebSocket(ws_url);
chatSocket.onmessage = function(event) {
var data = JSON.parse(event.data);
console.log('data', data);
};
</script>
routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})
asgi.py
import os
from channels.routing import ProtocolTypeRouter
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'twitch_chess.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application()
})
settings.py
ASGI_APPLICATION = "twitch_chess.asgi.application"
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)],
},
},
}
CHANNEL_GROUP_NAME = 'chat'
требования:
django
django-heroku
gunicorn
uvicorn[standard]
requests
channels
channels-redis