Я пытаюсь повторно использовать HTTP-сессию в качестве совета по aiohttp
Не создавать сеанс для запроса.Скорее всего вам нужен сеанс для приложения, который выполняет все запросы в целом.
Но обычный шаблон, который я использую с запросами 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-сессию?
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)