httpx,一个现代的 Python 库!

文摘   2024-11-01 12:52   河南  

异步时代的新选择:深入httpx的世界

Python的网络请求库太多了,requests库用得挺爽,可是一到异步场景就歇菜了。用aiohttp吧,写法又不太优雅。我找来找去,发现了个宝藏库 -httpx ,简直就是集大成者,同步异步都不在话下。

基本使用方法

httpx的语法跟requests基本一致,上手超级简单:
    import httpx
    
    # 发送GET请求
    response = httpx.get('https://api.github.com')
    print(response.status_code)  # 200
    print(response.json())  # 返回JSON数据

还可以带上请求头和参数:

    headers = {'User-Agent': 'python-httpx/0.24.0'}
    params = {'q': 'python'}
    response = httpx.get(
        'https://api.github.com/search/repositories'
        headers=headers,
        params=params
    )

温馨提示:记得检查响应状态码哦,别一股脑就去解析返回数据,万一请求失败了呢?

异步请求才是重头戏

要说httpx最牛的地方,那必须是异步请求。看看这代码多优雅:
    import asyncio
    import httpx
    
    async def fetch_data():
        async with httpx.AsyncClient() as client:
            response = await client.get('https://api.github.com')
            return response.json()
    
    # 运行异步函数
    data = asyncio.run(fetch_data())

想发送多个并发请求?轻轻松松:

    async def get_multiple_apis():
        urls = [
            'https://api.github.com/users/python'
            'https://api.github.com/users/django'
            'https://api.github.com/users/flask'
        ]
        async with httpx.AsyncClient() as client:
            tasks = [client.get(url) for url in urls]
            responses = await asyncio.gather(*tasks)
            return [r.json() for r in responses]

超时和重试机制

网络请求老出问题?httpx给你兜底:
    # 设置超时时间
    client = httpx.Client(timeout=5.0)
    
    # 使用重试机制
    transport = httpx.HTTPTransport(retries=3)
    client = httpx.Client(transport=transport)

温馨提示:异步客户端记得用完要关闭,最好用 async with 语法,省心又省力。

HTTP/2 支持

现在是2024年了,HTTP/2不会用说不过去吧:
    client = httpx.Client(http2=True)
    response = client.get('https://nghttp2.org')
    print(response.http_version)  # HTTP/2

我还发现一个好玩的事,用HTTP/2发请求真的比HTTP/1.1快不少,特别是在并发请求多的时候。

请求中间件

想在每个请求里加点料?中间件安排上:
    class LoggingMiddleware:
        async def __call__(self, request):
            print(f“请求: {request.method} {request.url}”)
            response = await request.send()
            print(f“响应: {response.status_code}”)
            return response
    
    client = httpx.AsyncClient(middlewares=[LoggingMiddleware()])

讲真,用了httpx后,我都不想用别的HTTP库了。它把requests的简单好用和异步的高性能完美结合在一起,还加入了不少现代特性。对了,差点忘了说,它的文档写得也超级清晰。

把这些基础用法掌握了,基本上能应付大部分场景了。想要更高级的玩法,比如自定义传输层、复杂的认证方式,可以去翻翻官方文档,里面有不少好东西。

翔宇风
精彩纷呈,引人入胜。
 最新文章