Httpx(异步的Requests库)实际使用中的一些技巧和心得

本文介绍使用异步HTTPX库进行网络请求的具体方法,包括如何配置代理、处理常见异常及异步任务管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的说,同步库下的Httpx的用法基本完全等价于Requests库的用法,其中requests的session和Httpx中的client基本都是一个东西。

 

1. 简单的例子:

self.client = httpx.AsyncClient(proxies=self.proxylist[0])

respond = await self.client.post(url, data=inputdata,headers = headers)

在实例化时期先将AsyncClient 建立好,在需要清理资源时候使用 self.client.close(),注意两点:

httpx有client 和 AsyncClient两种client,如果需要在异步环境中使用务必选用AsyncClient。

  • AsyncClient和proxy是绑定的,我没找到相关更换proxy的方法(如果大佬知道务必告诉小弟一声)
  • AsyncClient 的上下文管理器需要用async with 我这里没有用是因为想说明client 的关闭和开启可以自己控制,更换proxy时候需要控制其关闭和开启,大家使用时候应该要注意自己的使用逻辑。

 

2.常见proxy异常:

  • httpx.ProxyError 当所调用的代理格式出问题,或者链接不上时候会在 调用respond的future对象的结果时候request_result_future.result()抛出这个异常
  • 第二个是逻辑上的异常,当两个request同时通过一个client 同时发出,一个request因为异常或者其他逻辑关闭了client 会抛出
  •   [SSL: APPLICATION_DATA_AFTER_CLOSE_NOTIFY] application data after close notify (_ssl.c:2745)异常,这里需要在逻辑里处理。

 

3. 异步HTTPx经验总结:

  • 异步调用httpx的request只能用AsyncClient的client去处理get post这类的语句(类似于requests的Session的方法)
  • 如果远端返回的是json 可以用 respond.json()直接拿到dict体,但注意:当远端返回404、403等错误页面时候这个json不是仅仅拿不到东西,而是抛出解析异常,需要捕获。
  • 将任务添加到loop中可以用self.loop.create_task(woo()) 其中woo是一个coroutine对象(就是那个async def定义的函数。)
  • 异步最重要的是当这个程序被异步的形式放到loop里,它的异常是怎么捕获的(调用future.result()的时候抛出)如何在逻辑避免或者解决当一起放入loop里的若干个request出现问题时候 对共享的client环境做出改变后,其他的request如何处理
  • 当要给一个task绑定一个callback时候可以用 self.prefetch_task.add_done_callback(self.build_prefetch_callback)
    但是要注意,这个callback是一个普通函数,不是异步函数,如果有部分内容需要异步调用 可以再用loop.create_task 方法将任务加入到loop中
  • 在逻辑上要注意一个条件/异常发生时候,loop中是否有相关的任务,有的话如何处理,多次调用callback的话,这个情况会比较复杂 编程时候要多注意。
  • 一个线程里只有一个loop,但是在asyncio.get_event_loop() 调用的时候可能你的程序并不在你想象的那个程里,这里要考虑用 asyncio.set_event_loop 让你的程序在这个线程里能调用到你想要调用的loop
  • 想让程序更快,可以在等待的循环里调用一个 await asyncio.sleep(0.1)(作用相当于yield 不过有个0.1的时间让CPU有时间去处理其他事情),如果你用await asyncio.sleep(0)那程序就会把所在的CPU线程怼到99%(程序不断的在你的等待循环里和外部代码中切换)只要睡眠一点点这个程序就不会把CPU占满。

 

<think>好的,用户想了解如何用`import httpx as requests`,也就是用httpx并重命名为requests。首先,我得解释httpx是什么,它requests的关系。可能用户之前用过requests,所以想用类似的别名方便迁移。 接下来,需要说明导入语句的作用,就是把httpx导入并命名为requests,这样用户可以用requests.get()这样的方法,就像原一样。然后,要比较httpxrequests的异同,强调httpx支持异步HTTP/2,性能更好,功能更多。 然后,应该给出基本用法的例子,比如同步请求,异步的例子,展示如何使用async with。可能用户不太清楚异步,需要简单说明异步的优势,比如高并发时更高效。 还要注意提醒用户,虽然别名让代码迁移容易,但两者API可能有差异,比如响应对象的属性或方法不同,需要检查文档。可能用户会遇到兼容性问题,比如resp.json()在两者中的行为是否一致,或者流式请求的处理方式不同。 最后,总结使用场景,建议需要异步或高级功能时选httpx,简单项目用requests可能更合适。同时,给出安装命令,确保用户知道如何安装httpx。 检查是否有遗漏的点,比如是否需要提到安装注意事项,或者常见错误。比如,如果用户同时安装了requestshttpx,但导入了错误的,可能会有问题,但这里别名已经处理了。另外,确保代码示例正确,使用$...$$$...$$的格式是否符合要求,比如行内代码用反引号,而数学公式用LaTeX格式,但这里可能不需要数学公式,所以主要关注代码部分是否正确。 总之,结构应该是先介绍导入语句,然后比较异同,基本用法,异步示例,注意事项,最后总结安装步骤。确保用中文,口语化,分步骤解释,帮助用户理解。</think>以下是对 `import httpx as requests` 的分步解释: --- ### 1. **基础概念** - **`httpx`** 是 Python 的第三方 HTTP 客户端,支持同步异步请求,功能比标准 `requests` 更强大(例如支持 HTTP/2、连接池、WebSocket 等)。 - **`as requests`** 将导入的 `httpx` 模块重命名为 `requests`,目的是让代码更贴近 `requests` 的写法(减少迁移成本)。 --- ### 2. **为何这样写?** - **兼容性目的**:如果已有代码基于 `requests` 编写,可通过重命名快速替换为 `httpx`(需注意 API 差异)。 - **简化习惯**:保持类似 `import requests` 的调用方式,例如 `requests.get()`。 --- ### 3. **基本用法示例** #### 同步请求 ```python import httpx as requests # 发送 GET 请求(同步) resp = requests.get("https://httpbin.org/get") print(resp.status_code) print(resp.json()) ``` #### 异步请求(需 `async` 环境) ```python import httpx as requests async def fetch_data(): async with requests.AsyncClient() as client: resp = await client.get("https://httpbin.org/get") print(resp.text) ``` --- ### 4. **与 `requests` 的异同** | 特性 | `requests` | `httpx` | |---------------------|------------------|--------------------------| | 同步请求 | ✔️ | ✔️ | | 异步请求 | ❌ | ✔️(需 `AsyncClient`) | | HTTP/2 支持 | ❌ | ✔️ | | 连接池管理 | 基础 | 更高效 | | 流式下载/上传 | 有限 | 更灵活 | --- ### 5. **注意事项** - **API 差异**:虽然重命名了模块,但具体方法可能不同。例如: - `httpx` 的响应对象属性略有不同(如 `.json()` 是方法而非属性)。 - 需要显式创建 `Client` 或 `AsyncClient` 实例以复用连接。 - **依赖安装**:需先安装 `httpx`: ```bash pip install httpx ``` --- ### 6. **适用场景** - 需要异步请求或 HTTP/2 支持时优先选 `httpx`。 - 简单项目或已有 `requests` 代码可尝试用此写法逐步迁移。 如需进一步对比或代码示例,可以具体提问! 😊
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值