Как разрешить потребителю Channels получить доступ к сессии, генерируемой HTTP-запросами?

У меня есть проект, который раньше работал под WSGI, и я недавно настроил его на ASGI. Он включал код, созданный в те времена, например, следующую функцию, которая обрабатывает запрос на вход в систему:

def authenticate(req):
    ...
    try:
        query = models.User.objects.get(...)
        req.session['user'] = query.id #Login successful
        ...
    except:
        #No record, reject request
        ...

Теперь я хочу создать WebsocketConsumer и получить доступ к сессии из него. Я включил SessionMiddlewareStack. Проблема в том, что потребитель даже не видит сессию, потому что ID сессии не прикреплен к WebSocket-запросу в качестве заголовка. Есть ли способ позволить ему получить доступ к данным?

class SpaceConsumer(WebsocketConsumer):
    def connect(self):
        #Session object is empty, while HTTP requests see it as populated with the user's ID
        if 'user' in self.scope['session']: 
            self.accept() #Only allow authenticated user

Информации в сети мало, и большинство из нее написано для старых версий Channels. Я использую Channels v3.

Неважно; это была глупая ошибка.

На случай, если в будущем сюда придут другие люди с такой же путаницей, вот ссылка на решение: Использовать данные сессии на рукопожатии websocket.

Домен, с которым вы создаете Websocket-соединение, должен совпадать с доменом вашей страницы. В моем случае я открыл приложение, используя 127.0.0.1, но подключился к WS, используя localhost. В результате куки не были открыты.

Channels прекрасно обеспечивает доступ к объектам сессии.

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