Class() получил неожиданный ключевой аргумент 'unique_id', когда пытался подключиться к WebSocket

Я пытаюсь подключиться к своему Django WebSocket, но получаю следующее исключение:

TypeError: ChatConsumer() получил неожиданный аргумент в виде ключевого слова 'unique_id'

"GET /ws/chat_app/sjfAmH/ HTTP/1.1" 500 64965

Я в основном следую учебнику, и именно так парень делает это там. Я также просмотрел другие реализации и обнаружил, что это тот же самый способ. Я новичок в использовании WebSockets, буду благодарен за любую помощь. Заранее спасибо!

Это мой ChatConsumer класс:

    # chat/consumers.py
    
    import json
    from channels.generic.websocket import AsyncWebsocketConsumer
    from asgiref.sync import sync_to_async
    from .models import Message
    from room_app.models import Room
    
    class ChatConsumer(AsyncWebsocketConsumer):
        async def connect(self):
    
            self.unique_id = self.scope['url_route']['kwargs']['unique_id']
            self.room_group_name = f'chat_{self.unique_id}'
    
            # Check if the room exists in the database
            if not await self.room_exists():
                await self.close()
                return
    
            # Join room group
            self.channel_layer.group_add(
                self.room_group_name,
                self.channel_name
            )
    
            self.accept()
    
        def disconnect(self, close_code):
            # Leave room group
            self.channel_layer.group_discard(
                self.room_group_name,
                self.channel_name
            )
    
        # Receive message from WebSocket
        def receive(self, text_data):
            text_data_json = json.loads(text_data)
            message = text_data_json['message']
    
            # Save message to database
            Message.objects.create(
                room=self.unique_id,
                user=self.scope['user'],
                content=message
            )
    
            # Send message to room group
            self.channel_layer.group_send(
                self.room_group_name,
                {
                    'type': 'chat_message',
                    'message': message,
                    'username': self.scope['user'].username
                }
            )
    
        # Receive message from room group
        def chat_message(self, event):
            message = event['message']
            username = event['username']
    
            # Send message to WebSocket
            self.send(text_data=json.dumps({
                'message': message,
                'username': username
            }))
        
        @sync_to_async
        def room_exists(self):
            return Room.objects.filter(unique_id=self.unique_id).exists()

Это шаблон WebSocket url, который я определил в моем routing.py:

    from django.urls import re_path
    from .consumers import ChatConsumer
    
    # The WebSocket URL pattern for chat rooms is defined by this code
    websocket_urlpatterns = [
        re_path(r'chat_app/(?P<unique_id>\w+)/$', ChatConsumer.as_asgi()),
    ]

Затем я добавил это в свой проект Django urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    ...,
    path('ws/', include(websocket_urlpatterns)),
]

Я пытаюсь получить доступ к этой конечной точке в браузере следующим образом:

http://192.168.0.11:8000/ws/chat_app/sjfAmH/

При необходимости, в моем Flutter приложении я пытаюсь получить к нему доступ следующим образом:

    _channel = IOWebSocketChannel.connect(Uri.parse(
            'ws://192.168.0.11:8000/ws/chat_app/${room.uniqueID}'));

Обновление:

Я попробовал определить метод __init__ для этого класса, например, так:

def __init__(self, *args, **kwargs):
        self.unique_id = kwargs.pop('unique_id', None)
        super().__init__(*args, **kwargs)

и настраиваю файл проекта asgi.py следующим образом:


import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from chat_app.routing import websocket_urlpatterns
from channels.security.websocket import OriginValidator

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),  # Django HTTP ASGI application
    "websocket": OriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                websocket_urlpatterns
            ),
            ['*']
        )
    ),  # Django Channels WebSocket ASGI application
})

Не помогло.

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