Websocket соединение не работает в Django Channels ('WebSocket соединение с 'ws://localhost:8000/ws/board/7/' failed:')
Я пытаюсь запустить веб-сокет для проекта Django, над которым я работаю, но я не могу заставить веб-сокет подключиться, что странно, поскольку я скопировал пример приложения чата из документации по каналам и он работал нормально, но когда я скопировал тот же код в свой проект, он не работал
Итак, вот соответствующие участки кода:
соответствующее представление в файле views.py
def board_view(request, key):
board = get_object_or_404(request.user.boards, pk=key)
key = dumps(board.pk)
return render(request, 'core/board.html',
{"board":board, "permission":user_permission, "key":key})
board.html (соответствующая часть)
<script>
const key = JSON.parse("{{key|escapejs}}");
const chatSocket = new WebSocket(
'ws://'
+ window.location.host
+ '/ws/board/'
+ key
+ '/'
);
routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r"^ws/board/(?P<key>\d+)/$", consumers.ChatConsumer.as_asgi()),
]
consumers.py
import json
from channels.generic.websocket import WebsocketConsumer
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.accept()
self.send(text_data=json.dumps({
'type':'connection_established',
'message':'you are now connected'
}))
def disconnect(self, close_code):
pass
def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json["message"]
self.send(text_data=json.dumps({"message": message}))
asgi.py
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sketchboard.settings')
django_asgi_app = get_asgi_application()
import core.routing
application = ProtocolTypeRouter({
"http": django_asgi_app,
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(core.routing.websocket_urlpatterns))
),
})
settings.py (соответствующая часть):
ASGI_APPLICATION = 'sketchboard.asgi.application'
и
INSTALLED_MY_APPS = [
'core',
]
INSTALLED_EXTENSIONS = [
'daphne',
'allauth',
'allauth.account',
'allauth.socialaccount',
'guest_user',
'guest_user.contrib.allauth',
'rest_framework',
'channels',
]
Это почти идентично учебной настройке websocket, найденной в документации channels (которая отлично работала, когда я ее пробовал).
Итак, то, что я должен получить из консоли на странице 'board_view' - это "вы теперь подключены" (как определено в consumers.py
), однако вместо этого я получаю
WebSocket connection to 'ws://localhost:8000/ws/board/7/' failed:
сообщение.
Я должен отметить, что 7 - это 'key', который является динамической переменной, но эта часть определенно работает.
Я также попробовал просто ввести 'test' в качестве маршрута в board.html
и routing.py
так что получилось что-то вроде:
const chatSocket = new WebSocket('ws://' + window.location.host + '/test');
Но я получаю ту же ошибку, поэтому я не думаю, что проблема заключается в файлах routing.py
или board.html
.
Я также пробовал спросить у django discord server, но они не смогли помочь.
Эта проблема действительно поставила меня в тупик, поэтому любая помощь будет очень признательна! :)
Возможно, вы установили channels версии 4, которая является последней, по умолчанию, и это не запускает ASGI сервер в режиме разработки. пожалуйста, проверьте это и установите channels версии == 3.0.5 . проверьте, что ASGI сервер запускается при выполнении команды runserver.
Если нет, дайте мне знать, мы обсудим больше.
вам не хватает этого в файле settings.py
ASGI_APPLICATION = 'appname.asgi.application'
Для
channels==4.0.0
было сделано изменение, упомянутое здесь, которое требует, чтобы вы также поставилиdaphne
вINSTALLED_APPS
, передdjango.contrib.staticfiles
. Выполните такжеpip install -U 'channels[daphne]' channels-redis
, чтобы убедиться, что у вас совместимые версииdaphne
иchannels-redis
.Альтернативный вариант - запуск
daphne <your main app>.asgi:application
из корня вашего проекта (где находитсяmanage.py
) вместоpython manage.py runserver
работает.Дополнительно, как уже упоминалось, понижение до
channels==3.0.5
- это еще один способ заставить его работать без добавленияdaphne
в вашINSTALLED_APPS
.