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)),
]
Я пытаюсь получить доступ к этой конечной точке в браузере следующим образом:
При необходимости, в моем 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
})
Не помогло.