Каналы 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]

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