当重用ClientSession时, aiohttp请求失败



我在创建一个与第三方rest API交互的库时遇到了一些奇怪的事情。我对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")

我不会结束我的会议。我在Thing类中调用的方式没有什么特别奇怪的:

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是诚实的,但是有没有人有任何线索可以从一个请求泄漏到下一个会话不能被重用?

我是在睡了一夜好觉,来回思考了一番之后才想出这个办法的。默认情况下,aiohttp会处理在一个请求中接收到的cookie,并在随后的请求中将它们发送回去。由于某些未知的原因,当我向他们发送cookie时,我正在使用的API会发生惊人的变化。

aiohttp允许配置noopcookie_jar忽略cookie:

from aiohttp import ClientSession, DummyCookieJar
session = ClientSession(cookie_jar=DummyCookieJar())

这样仍然可以利用共享连接池的性能,但忽略cookie。

最新更新