braxi
@braxi
Начинающий индивидуальный разработчик

Как в aiohttp/websocket-server работать с cookie?

Как получать и отправлять cookie внутри websocket_handler? Пробовал задействовать aiohttp_session, но пример, который там приведен, работает с обычным handler, а с websocket_handler тот же самый пример не работает: браузеру не отправляются куки. Может я что-то не так делал. Неважно, с помощью aiohttp_session или без, но мне нужно получать и отправлять cookie внутри websocket_handler, подскажите, как это делать грамотно. Можно ли в данном случае работать с куками без сессий?

# куки отправляются
async def handler(request):
   session = await get_session(request)   
   session['test'] = 'test'  
   return web.Response()

# куки НЕ отправляются
async def websocket_handler(request):
   ws = web.WebSocketResponse()
   await ws.prepare(request)

   session = await get_session(request)   
   session['test'] = 'test'  

   ...

   return ws
  • Вопрос задан
  • 1209 просмотров
Решения вопроса 1
@lega
Кука отправляется в http ответе, с вебсокетом этот ответ отправляется до передачи данных (стрима), поэтому можете попробовать установить куку до отправки ответа, т.е. до ws.prepare (только зачем?)

Но обычно делают так: устанавливать куки в обычном handler (авторизация и т.п.), они будут прилетать в websocket_handler при подключении

Так же можете отправлять команду через веб сокет, и устанаваливать куку через js
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MirKey
Для будущего искателя:
В при рукопожатии WebSocket без проблем можно установить cookie. Если это нужно сделать позже, то либо нужно делать дополнительные HTTP/GET запросы для установки cookie с сервера, либо установить cookie через JS/WebSocket
Пример установки cookie для aiohttp
async def websocket_handler(request):
    ws = web.WebSocketResponse()
    
    #  set cookie when shaking hands
    ws.set_cookie('name', 'value', path='/', expires=None, domain=None, max_age=86400*30, secure=True, httponly=True, version=None, samesite='None')

    await ws.prepare(request)

    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            if msg.data == 'close':
                await ws.close()
            else:
                await ws.send_str(msg.data + '/answer')
        elif msg.type == aiohttp.WSMsgType.ERROR:
            print('ws connection closed with exception %s' %
                  ws.exception())

    print('websocket connection closed')
    return ws
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы