Ошибка в каналах Django: ValueError: Нет приложения, настроенного для типа scope 'websocket'
Я собираюсь разработать приложение чата с использованием Django Channels, следуя учебникам: https://channels.readthedocs.io/en/stable/tutorial/part_2.html
Мой уровень проекта routing.py
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import chat.routing
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})
Файл маршрутизации.py уровня приложения from django.urls import re_path from . import consumers
websocket_urlpatterns = [
re_path(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer)
]
файлasgi.py
import os
from channels.routing import ProtocolTypeRouter
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
# Just HTTP for now. (We can add other protocols later.)
})
Я полагаю, что вы поменяли содержимое уровня проекта routing.py с файлом asgi.py. Я воссоздал рабочую версию проекта в соответствии с упомянутой вами документацией . Затем я поменял местами содержимое routing.py (уровень проекта) и asgi.py, и получил ту же ошибку, что и вы, при попытке подключения к WebSocket:
Django version 4.0.2, using settings 'django_channels_example.settings'
Starting ASGI/Channels version 3.0.4 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
HTTP GET / 200 [0.01, 127.0.0.1:53043]
WebSocket HANDSHAKING /ws/chat/lobby/ [127.0.0.1:53045]
Exception inside application: No application configured for scope type 'websocket'
Traceback (most recent call last):
Команда, которую я использовал в JavaScript консоли браузера для подключения к websocket:
webSocket = new WebSocket('ws://localhost:8000/ws/chat/lobby/');
Вы также пропустили .as_asgi() в файле уровня приложения routing.py (т.е. chat/routing.py):
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi())
См: https://channels.readthedocs.io/en/stable/tutorial/part_2.html#write-your-first-consumer
Однако я сомневаюсь, что именно это вызвало ошибку. Ошибка, которую вы получили, возникает, например, когда в настройках маршрутизации отсутствует ключ 'websocket' (см. этот ответ), поэтому будьте внимательны и в этом случае.
Также убедитесь, что у вас есть это в вашем settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'channels',
'chat'
]
...
# Where `django_channels_example` is the name of your application
WSGI_APPLICATION = 'django_channels_example.wsgi.application'
ASGI_APPLICATION = 'django_channels_example.asgi.application'