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.

Если нет, дайте мне знать, мы обсудим больше.

enter image description here

вам не хватает этого в файле 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.

Вернуться на верх