我尝试重用 HTTP-session 作为 aiohttp 文档建议
不要为每个请求创建会话。您很可能需要每个应用程序一个会话来完全执行所有请求。
但是我与 requests lib 一起使用的通常模式不起作用:
def __init__(self):
self.session = aiohttp.ClientSession()
async def get_u(self, id):
async with self.session.get('url') as resp:
json_resp = await resp.json()
return json_resp.get('data', {})
然后我尝试
await client.get_u(1)
我有错误
RuntimeError: Timeout context manager should be used inside a task
async_timeout 的任何解决方法都没有帮助。
另一种方法是工作:
async def get_u(self, id):
async with aiohttp.ClientSession() as session:
with async_timeout.timeout(3):
async with session.get('url') as resp:
json_resp = await resp.json()
return json_resp.get('data', {})
但这似乎是为每个请求创建会话。
所以我的问题是:如何正确重用 aiohttp-session?
UPD:最小的工作示例。具有以下视图的 Sanic 应用程序
import aiohttp
from sanic.views import HTTPMethodView
class Client:
def __init__(self):
self.session = aiohttp.ClientSession()
self.url = 'https://jsonplaceholder.typicode.com/todos/1'
async def get(self):
async with self.session.get(self.url) as resp:
json_resp = await resp.json()
return json_resp
client = Client()
class ExView(HTTPMethodView):
async def get(self, request):
todo = await client.get()
print(todo)