aiohttp库

aio-libs 组织发布了一系列的异步库,其中就包含异步网络库 aiohttp,aiohttp 库有以下特点。

  • aiohttp 既是 HTTP 客户端,也是 HTTP 服务端。

  • aiohttp 同时支持服务端的 WebSocket 和客户端的 WebSocket。

  • aiohttp 作为服务端来说,有中间件、信号和可插拔的路由。

因为 aiohttp 库简单易用、功能强大,已经成为发送异步网络请求的首选框架。通过以下命令即可安装 aiohttp 库。

$ pip install aiohttp[speedups]

上述命令除了安装 aiohttp 库,还会安装 cchardet 和 aiodns 库,cchardet 库是为了替换默认的 chardet 库,从而达到更高的效率。aiodns 库可以提高 DNS 域名的解析速度。我们首先来看 aiohttp 的使用例子,代码如下。

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://python.org') as response:
            print("状态码:", response.status)
            html = await response.text()
            print("响应体:", html)

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

上述代码中,首先使用 async with 创建了一个会话对象 session,其中 async with 是异步上下文,与普通的 with 语句用法类似。然后使用 session.get 方法获取数据,并将响应赋值给 response 对象。因为状态码可以直接获取,所以不需要执行 await,而响应体则需要经过读取和解码,因此使用了 await 等待协程的方式获取。这样就使用 aiohttp 库完成了一个基本的网络请求功能。