python aiohttp的使用详解
Python的aiohttp库是基于asyncio的HTTP客户端和服务器框架,它允许开发者编写高效的、非阻塞的网络I/O程序。aiohttp使得在Python中处理并发HTTP请求变得更加便捷,尤其适合于需要大量网络I/O操作的异步应用。 1. **aiohttp简单使用** aiohttp的基本用法是配合`asyncio`模块,通过`async with`语句进行异步请求。例如,使用`aiohttp.request`发起GET请求,等待响应并读取文本内容。`asyncio.get_event_loop()`获取事件循环,`run_until_complete`执行协程。示例中的`fetch_async`函数就展示了如何获取网页文本。通过`asyncio.gather`可以并发执行多个任务。 2. **使用Session发起请求** `aiohttp.ClientSession`提供了一种更高级的API,用于管理HTTP连接。在一个`ClientSession`实例中发起的请求可以共享连接,提升性能。`async with session.get(url)`发起GET请求,等待响应。`session`支持多种HTTP方法如POST、PUT、DELETE等。使用一个`ClientSession`实例执行所有请求,可以利用连接池和连接复用,提高性能。 3. **在URL中传递参数** 在使用`ClientSession`发起请求时,可以通过`params`参数将字典传递给URL,以便添加查询字符串。例如`session.get(url, params=params)`,其中`params`是一个包含键值对的字典,会被自动转换为URL查询字符串。 4. **获取响应内容** 获取响应内容通常是一个阻塞操作,因此需要使用`await`关键字等待协程完成。`response.text()`返回解码后的文本内容,而`response.read()`则返回原始的二进制数据。如果处理的是非文本内容,如图片或音频,可以直接使用`response.read()`。 5. **处理HTTP头部和状态码** `response.status`属性可以获取HTTP响应的状态码,如200表示成功,404表示未找到等。而`response.headers`则提供了访问HTTP头部的方法,可以获取如Content-Type、Set-Cookie等信息。 6. **处理cookies** `ClientSession`支持cookies管理。在发送请求时,cookies会自动添加到请求头;在接收响应时,新cookies会自动保存到session中,下次请求时会自动带上。 7. **上传和下载文件** `session.post`方法可以用来发送POST请求,可以配合`data`参数上传文件。对于大文件下载,可以使用`response.content.read()`逐块读取,避免一次性加载到内存。 8. **超时设置** 可以通过`timeout`参数设置请求超时,如`session.get(url, timeout=aiohttp.ClientTimeout(total=10))`,10秒后如果没有收到响应,请求将被中断。 9. **处理重定向** 默认情况下,aiohttp会自动处理HTTP状态码为3xx的重定向。如果不想自动处理,可以通过`allow_redirects=False`禁用此功能。 10. **错误处理** 使用`try/except`结构捕获可能出现的网络异常,如`ConnectionError`、`TimeoutError`等。 在实际开发中,aiohttp的强大之处在于其能够优雅地处理大量并发请求,提高了服务器的吞吐量。通过结合asyncio和aiohttp,开发者可以构建出高效、非阻塞的网络服务和客户端应用。