Каналы Dajngo - при использовании SessionMiddlewareStack возникает ошибка synchronousonlyoperation
Я пытаюсь реализовать анонимный чат, используя Django Channels для websocket соединения. Однако, я продолжаю получать исключение SynchronousOnlyOperation при использовании SessionMiddlewareStack для аутентификации.
Версия Python: 3.8 Версия Django: 4.1 Версия каналов: 3.0.5
Consumers.py:
import json
from channels.generic.websocket import AsyncWebsocketConsumer
from channels.db import database_sync_to_async
from .models import *
class ChatConsumer(AsyncWebsocketConsumer):
@database_sync_to_async
def add_user_to_room_pool(self):
former = Pool(username=self.user, room_name=self.get_room())
former.save()
@database_sync_to_async
def remove_user_from_room_pool(self):
former = Pool.objects.filter(username=self.user, room_name=self.get_room())
former.delete()
async def connect(self):
self.room_id = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = 'chat_%s' % self.room_id
self.user = self.scope['session']['Anonymous-Name']
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.add_user_to_room_pool()
await self.accept()
async def disconnect(self, close_code):
await self.remove_user_from_room_pool()
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
await self.create_message(message)
await self.channel_layer.group_send(
self.room_group_name, {
'type': 'chat_message',
'message': message,
}
)
@database_sync_to_async
def get_room(self):
return Room.objects.get(name=self.room_id)
@database_sync_to_async
def get_user(self):
return Hikka.objects.get(user=self.scope['user'].id)
@database_sync_to_async
def create_message(self, text):
former = Message(message_author=self.user, message_room=self.get_room(), message_text=text)
former.save()
async def chat_message(self, event):
message = event['message']
await self.send(text_data=json.dumps({
'message': message
}))
Я пробовал удалять все кэшированные данные сессии как из Django, так и из веб-браузера, но это не помогло. Я видел пользовательскую реализацию Middleware, которая использует аутентификацию с помощью токенов, но это не то, что мне нужно.
Мне нужно иметь возможность использовать self.scope['session'] для хранения данных об имени пользователя анонимных пользователей, но когда я пытаюсь использовать SessionMiddlewareStack, я получаю ошибку:
raise SynchronousOnlyOperation(message)
django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
WebSocket DISCONNECT /ws/chat/kekglish/ [127.0.0.1:39396]