httpx:如何访问收集到的请求任务的特定响应?

httpx: How to access specific responses from gathered request tasks?

我想使用 HTTPX(在 FastAPI 中,如果这很重要)向外部发出异步 http 请求 API 并将响应存储为单独的变量,以便以略有不同的方式进行处理,具体取决于在其上获取 URL。我正在修改 Whosebug 答案中的代码。

import asyncio
import httpx

async def perform_request(client, url):
    response = await client.get(url)
    return response.text

async def gather_tasks(*urls):
    async with httpx.AsyncClient() as client:
        tasks = [perform_request(client, url) for url in urls]
        result = await asyncio.gather(*tasks)
        return result

async def f():
    url1 = "https://api.com/object=562"
    url2 = "https://api.com/object=383"
    url3 = "https://api.com/object=167"
    url4 = "https://api.com/object=884"
    result = await gather_tasks(url1, url2, url3, url4)
    # print(result[0])
    # print(result[1])
    # DO THINGS WITH url2, SOMETHING ELSE WITH url4, ETC.

if __name__ == '__main__':
    asyncio.run(f())

访问个人回复的最佳方式是什么? (如果我使用 result[n],我将不知道我正在使用哪个响应。)

一般来说,我对 httpx 和异步操作还很陌生,所以如果您对如何以更好的方式实现它有任何建议,请分享。

不管AsyncIO,我可能会把逻辑放在里面gather_tasks。在那里你知道响应,你可以定义所有你想要继续正确路径的if else逻辑。

在我看来你有两个选择:


1 - 立即处理请求

在这种情况下 f 只会初始化 url 并触发处理,其他一切都将在 gather_tasks 内发生。

2 - “丰富”响应

gather_tasks 中,您可以了解下一步要执行哪种操作,并将某种代码“附加”到响应以定义它。例如,您可以 return 一个带有两个键的字典:response 和 operation。这将是执行此操作的最明确的方式,但您也可以使用列表或元组,您只需要知道响应和“下一步代码”在其中的位置。

如果必须稍后而不是立即进行进一步处理,这将非常有用。


有道理吗?