Django 404 при подключении к роутеру websocket wh

Я пытаюсь написать свой первый Django проект с использованием вебсокетов. Я использую каналы django. И все работало хорошо, пока не пришло время интегрировать react, nginx и django.

Теперь я получаю:

Не удалось подключиться к wss://our.web.site/ws/notifications/id/?token={my_token}

URL запроса: https://our.web.site/ws/notifications/id/?token={my_token}

Метод запроса: GET Код состояния: 404 Not Found

my asgi.py:

import os

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application

from apps.notifications.middlewares import JwtAuthMiddlewareStack
from apps.notifications.routing import websocket_urlpatterns

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

# application = get_asgi_application()

application = ProtocolTypeRouter(
    {
        "http": get_asgi_application(),
        "websocket": AllowedHostsOriginValidator(
            JwtAuthMiddlewareStack(URLRouter(websocket_urlpatterns))
        ),
    }
)

my routing.py:

from django.urls import re_path

from . import consumers

websocket_urlpatterns = [
    re_path(r"ws/notifications/(?P<user_id>\w+)/$", consumers.NotificationConsumer.as_asgi()),
]

my consumers.py:

import json

from channels.db import database_sync_to_async
from channels.generic.websocket import AsyncWebsocketConsumer

from apps.notifications.models import Notification, OnlineUser


class NotificationConsumer(AsyncWebsocketConsumer):
    def __init__(self, *args, **kwargs):
        super().__init__(args, kwargs)
        self.user = None
        self.pool_name = None

    async def connect(self):
        self.user = self.scope["user"]
        self.pool_name = f"user_id_{self.user.id}"
        await self.accept()

        await self.channel_layer.group_add(
            self.pool_name,
            self.channel_name,
        )
        await self.add_online_user()

    async def disconnect(self, close_code):
        await self.remove_online_user()
        await self.channel_layer.group_discard(self.pool_name, self.channel_name)

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json["message"]
        await self.channel_layer.group_send(self.pool_name, {"type": "read_message", "message": message})

    async def read_message(self, event):
        message = event["message"]
        await self.mark_notifications_as_read(message)
        await self.send(text_data=json.dumps({"message": message, "message_type": "read_message"}, ensure_ascii=False))

    async def notification_message(self, event):
        message = event["message"]
        await self.send(text_data=json.dumps({"message": message}, ensure_ascii=False))

    @database_sync_to_async
    def mark_notifications_as_read(self, notification):
        Notification.objects.filter(
            object_id=notification["contentObjectId"], for_user=notification["userId"], type=notification["type"]
        ).update(read=True)

    @database_sync_to_async
    def add_online_user(self):
        OnlineUser.objects.get_or_create(user=self.user)

    @database_sync_to_async
    def remove_online_user(self):
        OnlineUser.objects.filter(user=self.user).delete()

nginx:

    location /ws/ {
        proxy_pass          http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection $connection_upgrade;
        proxy_set_header    Host $server_name;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    X-Forwarded-For $remote_addr;
    }

Я не уверен, что ошибка связана с бэкендом, и буду рад, если кто-нибудь поможет мне выяснить, с чем связана эта ошибка.

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