Я пытаюсь преобразовать Python HTTP-клиент с requests
в aiohttp
. Логика c предназначена для отправки вызова GET на конечную точку REST, которая периодически передает данные и печатает возвращаемые строки.
У меня есть код с использованием запросов с параметром stream=True
и iter_lines
, работает довольно хорошо:
import json
import requests
def main():
with requests.get('https://my-streaming-url.com', stream=True) as r:
if r.encoding is None:
r.encoding = 'utf-8'
for line in r.iter_lines(decode_unicode=True):
if line:
# Print each line emitted by the streaming api
print(json.loads(line))
if __name__ == '__main__':
main()
Теперь я хочу преобразовать этот лог c в aiohttp streaming api и попробовал:
import asyncio
import aiohttp
import json
loop = asyncio.get_event_loop()
async def main():
r = aiohttp.request('get', 'https://my-streaming-url.com')
async for line in r.content:
print(json.loads(line))
if __name__ == '__main__':
loop.run_until_complete(connect_and_listen())
loop.close()
Я получаю сообщение об ошибке:
... в connect_and_listen
asyn c для строки в r.content:
AttributeError: объект _SessionRequestContextManager ' не имеет атрибута 'content'
sys: 1: RuntimeWarning: сопрограмма ClientSession._request 'никогда не ожидалась
незакрытый сеанс клиента
client_session: aiohttp.client.ClientSession объект в 0x7fac6ec24310
Я пробовал несколько способов, таких как удаление loop.close()
из main
, удаление async
из for
l oop, но ни один не помог.
Что мне здесь не хватает? Как я могу напечатать линии потокового API с aiohttp
?
PS: Моя Python версия 3.7.5