запросы aiohttp завершаются ошибкой при повторном использовании сеанса клиента

#python #aiohttp

Вопрос:

Я испытываю что-то странное, создавая библиотеку, которая взаимодействует со сторонним API rest. Я довольно новичок в python и aiohttp, но никакое количество гуглов не дало мне никаких результатов.

Я заметил, что работает только первый запрос с клиентской сессией. Последующие вызовы завершаются неудачно.

     session = ClientSession()
    things = await Thing.all(session, username="me@mail.com", password="123") # works
    things = await Thing.all(session, username="me@mail.com", password="123") # 500 error from server
    things = await Thing.all(session, username="me@mail.com", password="123") # 500 error from server
 

Однако использование нового сеанса каждый раз работает:

     things = await Thing.all(ClientSession(), username="me@mail.com", password="123")    
    things = await Thing.all(ClientSession(), username="me@mail.com", password="123")
    things = await Thing.all(ClientSession(), username="me@mail.com", password="123")
 

Я не собираюсь закрывать свои сеансы.
Нет ничего особенно странного в том, как я звоню из своего класса вещей:

     resp = await session.post(
        url,
        data=f"Authorization=Bearer {token}"   data,
        headers={"accept": "application/json", "content-type": "application/x-www-form-urlencoded"}
    )
    resp.raise_for_status()
    return await resp.json()
 

Это вполне может быть ошибкой сервера API, честно говоря, это не очень хороший API, но есть ли у кого-нибудь какие-либо представления о том, что может передаваться от одного запроса к другому, поэтому сеансы нельзя использовать повторно?

Ответ №1:

Я сам понял это после хорошего ночного сна и немного туда-сюда. По умолчанию aiohttp обрабатывает файлы cookie, полученные по одному запросу, и отправляет их обратно по последующим запросам. По какой-то неизвестной причине API, который я использую, эффектно взрывается, когда я отправляю им файлы cookie.

aiohttp позволяет настроить noop cookie_jar , который игнорирует файлы cookie:

 from aiohttp import ClientSession, DummyCookieJar

session = ClientSession(cookie_jar=DummyCookieJar())
 

Таким образом, можно повысить производительность за счет наличия общего пула подключений, но файлы cookie игнорируются.