Как разрешить потребителю 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 прекрасно обеспечивает доступ к объектам сессии.