Python aiohttp 库是否值得学?那必须要掌握呀

news2024/11/28 4:36:51

aiohttp 是一个基于 asyncio 的异步 HTTP 客户端/服务器库。它提供了一组用于编写高性能异步网络应用程序的工具,包括基于协程的客户端和服务器。
库的安装使用 pip install aiohttp

Python aiohttp 库

    • 通过 aiohttp 搭建服务器
      • aiohttp 路由
      • aiohttp 中间件
    • aiohttp 发送异步 HTTP 请求
    • aiohttp 发送多个异步 HTTP 请求

通过 aiohttp 搭建服务器

掌握该库的入门案例就是搭建 aiohttp 服务器,示例代码如下:

from aiohttp import web


async def handle(request):
    name = request.match_info.get('name', "dream_ca")
    text = "你好, " + name
    return web.Response(text=text)


app = web.Application()
app.add_routes([web.get('/{name}', handle)])

web.run_app(app)

运行之后,该服务器会监听本地 8080 端口,然后访问 127.0.0.1:8080/ca 就可以得到下图所示内容。
Python aiohttp 库是否值得学?那必须要掌握呀
Python aiohttp 库是否值得学?那必须要掌握呀
继续扩展 aiohttp 库在服务器端的应用。

aiohttp 路由

aiohttp 提供了一个 WebApplication 类来处理路由,它具有一些方法来处理特定的 HTTP 方法,如 GET,POST 和 DELETE。下面是一个示例代码:

from aiohttp import web


# 创建一个处理GET请求的函数
async def handle_get(request):
    name = request.match_info.get('name', "梦想橡皮擦")
    text = "你好, " + name
    return web.Response(text=text)


# 创建一个处理POST请求的函数
async def handle_post(request):
    data = await request.json()
    text = f"你好, {data['name']}"
    return web.Response(text=text)


app = web.Application()

# 使用 app.router.add_get() 方法来处理GET请求
app.router.add_get('/{name}', handle_get)

# 使用 app.router.add_post() 方法来处理POST请求
app.router.add_post('/', handle_post)

web.run_app(app)

在上述代码中,使用 app.router.add_get() 方法来处理 GET 请求,并使用 app.router.add_post() 方法来处理 POST 请求。这两个方法都接受两个参数:一个是路由路径,另一个是处理该路由的函数。如果请求的 URL 匹配路由路径,aiohttp 将调用相应的处理程序来处理请求。

除此之外,request.match_info.get() 函数是 aiohttp 库中用来获取路由中变量部分的值的对象。它是一个字典类型,键是路由中变量的名称,值是请求 URL 中对应的值。

在路由中,变量部分通常用花括号 {} 来表示,如下所示:

app.router.add_get('/users/{user_id}', handle_get_user)

在上述代码中,路由是 '/users/{user_id}' ,其中 {user_id} 是一个变量。当请求 URL 为 '/users/666' 时,request.match_info 就会返回一个字典,其中包含一个键 'user_id' 和值 '666'

你可以使用 match_info.get(name, default) 来获取路由中变量的值,其中 name 是变量的名称,default 是默认值。如果变量名称不存在,则返回默认值。

aiohttp 中还可以使用 app.add_routes() 一次性添加多个路由。

from aiohttp import web


async def handle_index(request):
    return web.Response(text="index 页面")


async def handle_about(request):
    return web.Response(text="about 页面")


async def handle_i(request):
    return web.Response(text="i 页面")


app = web.Application()

app.add_routes([web.get('/', handle_index),
                web.get('/about', handle_about),
                web.post('/i', handle_i)])

web.run_app(app, host='127.0.0.1')

aiohttp 中间件

aiohttp 的中间件是一种组件,它可以在请求/响应处理过程中插入额外的逻辑。它可以在请求和响应之间插入额外的处理,并允许对请求和响应进行更改。

中间件的工作方式是:在请求到达应用程序之前先经过中间件的处理,再到达应用程序的处理函数,最后响应经过中间件的处理后返回给客户端。

请求->中间件->应用程序处理->中间件->响应

下面演示如何使用中间件添加响应计时功能,代码如下:

from aiohttp import web
import time


async def handle_index(request):
    time.sleep(1)
    return web.Response(text="index 页面")


async def handle_about(request):
    time.sleep(5)
    return web.Response(text="about 页面")


async def handle_i(request):
    time.sleep(10)
    return web.Response(text="i 页面")


# 定义一个中间件
async def timer_middleware(app, handler):
    async def middleware_handler(request):
        start_time = time.time()
        response = await handler(request)
        end_time = time.time()
        print(f"请求响应时间: {end_time - start_time} ")
        return response

    return middleware_handler


app = web.Application()

# 使用中间件
app = web.Application(middlewares=[timer_middleware])

app.add_routes([web.get('/', handle_index),
                web.get('/about', handle_about),
                web.post('/i', handle_i)])

web.run_app(app, host='127.0.0.1')

Python aiohttp 库是否值得学?那必须要掌握呀
上述代码我们定义了一个名为 timer_middleware 的中间件,它接受两个参数:apphandler。 app 是 aiohttp 的应用程序实例, handler 是要处理请求的函数。

中间件的逻辑是,在处理请求之前记录当前时间,然后调用传入的处理函数来处理请求,最后记录当前时间并计算请求处理时间。

最后,我们使用 app.middlewares 属性来添加中间件,这样就可以在请求处理之前和之后计算时间了。

中间件可以用于许多其他用途,如:

  • 验证身份;
  • 添加额外的请求头;
  • 捕获和处理异常;
  • 记录请求日志;
  • 对响应进行处理;

aiohttp 发送异步 HTTP 请求

在爬虫领域使用 aiohttp 更多的是发送异步请求。

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()


async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://baidu.com')
        print(html)


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

如果希望调用 aiohttp 库,还需要配合协程库 asyncio,该库的学习可以阅读橡皮擦的另一篇博客。

《Python 协程学习有点难度?这篇文字值得你去收藏》

aiohttp 发送多个异步 HTTP 请求

如果想要提高爬虫采集速度,可以搭配 asyncio.wait() 进行提速。

import aiohttp
import asyncio


async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()


async def main():
    async with aiohttp.ClientSession() as session:
        tasks = []
        tasks.append(asyncio.ensure_future(fetch(session, 'https://baidu.com')))
        tasks.append(asyncio.ensure_future(fetch(session, 'https://sogou.com')))
        tasks.append(asyncio.ensure_future(fetch(session, 'https://so.com')))
        done, pending = await asyncio.wait(tasks)
        for task in done:
            print(task.result())


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

在这个代码的基础上,我们可以继续使用 aiohttp 库提供的扩展功能来编写异步网络程序。详细的扩展功能如下所示。

  • 使用 aiohttp.ClientSession 类可以进行异步请求,这个类提供了多种方法来发起请求,如 get、post、put、delete 等。
  • 使用 aiohttp.TCPConnector 可以连接池管理,这个类允许你控制并发连接的数量,以及重用连接。
  • 使用 aiohttp.ClientTimeout 类可以设置超时时间,这个类可以设置 connect_timeout、read_timeout 和 total_timeout 三个属性来控制连接和读取超时时间。
  • 使用 aiohttp.ClientSession.request() 方法可以进行自定义请求,这个方法允许你设置请求的 method、url、headers 等参数。
  • 使用 aiohttp.ClientSession.post() 方法可以实现文件上传,使用 aiohttp.ClientSession.get() 方法可以实现文件下载。
  • 使用 aiohttp.ClientSession.request() 方法可以设置请求的高级选项,如请求的身份验证、代理、重定向、请求超时等。
  • 使用 aiohttp.ClientSession.ws_connect() 方法可以建立 WebSockets 连接,并使用 async for 来接收消息。

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 832 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习之模型融合】Blending混合法

前言 Stacking堆叠法基础知识:http://t.csdn.cn/dzAna 1、Blending的基本思想与流程👿 Blending融合是在Stacking融合的基础上改进过后的算法。在之前的课程中我们提到,堆叠法stacking在level 1上使用算法,这可以令融合本身向着损…

好家伙,这几个隐藏功能,太香了

很多小伙伴可能被小畅的问题搞糊涂了,因为很多人只会在电脑上堆砌各种小应用,而忽略了Windows原有的实用功能。 而我们也千万不要小看这些功能,它们说不定能在关键时刻助你一臂之力,帮到你不少忙呢! 那么今天小畅就为大…

MobaXterm连接出现 Network error: Connection timed out 问题解决

MobaXterm连接出现 Network error: Connection timed out: 接前文:CentOS安装, 点此查看文章,安装之后的SSH连接: 解决思路如下: 1、检查虚拟机端是否安装ssh 一般情况是可以自动安装的,直接在终端输入s…

系统分析师案例必备知识点汇总---2023系列文章一

一、系统规划 (视频内容:系统分析师-专业知识模块中的系统规划视频) 1 、可行性研究 经济可行性 技术可行性 法律可行性 用户使用可行性 也称为投资收益分析 或成本效益分析,主 要评估项目的建设成 本、运行成本和项目 建成后可能的经济收 益。 技…

eggjs框架源码解读

文章目录前言Egg进程模型Egg应用程序结构egg运行启动的内幕加载插件扩展内置对象加载中间件加载service加载路由加载配置设置应用信息执行业务逻辑文件加载机制结语前言 eggjs 是阿里在 Nodejs 技术上的一大杰作,也是对开源世界的一大贡献。里面包含了很多技术结晶…

Linux---进程概念

目录 1. 什么是进程? 2. 描述进程---PCB task_struct---PCB的一种 task_ struct内容分类 3. 组织进程 4. 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程---fork初识 1. 什么是进程? 其实,我们启动一个软件&#xf…

SLAM本质剖析番外-李群李代数的微分和导数

0. 简介 这几个月,博主已经从SLAM算法的使用向着算法的数学推导进行了记录和分享,之前也分享了李群李代数关注核心一文,从现象中解释了李群和李代数表达的含义。但是这还不够,所以这次作者作为SLAM本质剖析的番外,来介…

基础数字(一)位运算 哈希(数组中元素出现次数)

目录 力扣剑指 Offer II 070. 排序数组中只出现一次的数字 数组中只出现一次的数(其它数出现k次)_牛客题霸 数组中只出现一次的两个数字_牛客题霸_牛客网 数组中出现次数超过一半的数字_牛客题霸_牛客网 缺失的第一个正整数_牛客题霸_牛客网 力扣剑指…

[杂记]算法:前缀和与差分数组

这篇讲一下前缀和与差分数组的关系 1. 前缀和 1.1 一维数组前缀和 前缀和在处理数组中的连续子数组的某一段加和的问题中很有用, 因为是拿空间换时间, 可以将线性复杂度降低为常数时间复杂度. 前缀和的道理很简单, 对于数组arr[i],i0,...,n−1arr[i], i 0, ..., n - 1arr[i…

《Linux Shell脚本攻略》学习笔记-第四章

4.1 简介 本章主要介绍sed、awk、grep、cut等命令,这些工具可以相互结合以满足文本处理需求。 正则表达式是一种基础的模式匹配技术。 4.2 使用正则表达式 正则表达式是由字面文本和具有特殊意义的符号组成的。 1)位置标记 位置标记锚点是标识字符串位置…

Anaconda安装、opencv环境配置、jupyter notebook使用虚拟环境

目录一、Anaconda 的安装二、opencv 3.4.1.15版本安装三、jupyter notebook使用虚拟环境四、运行报错-缺库一、Anaconda 的安装 Anaconda官网:Anaconda Installers Anaconda历史版本:Anaconda Index of 这边建议和我装一样anaconda3 python3.7&#xf…

opencv的图像基本操作(基于jupyter Notebook)

opencv的基本操作cv2是opencv在python中的缩写,函数开头用cv2cv2.imread(cat.jpg) #读入图片cat.jpgcv2.imwrite(mycat.png,img) #图片img保存为mycat.pngcv2.imshow(image,img) #创建窗口,显示图像cv2.waitKey(10000) #等待时间,以 毫秒为单…

整数分解

问题描述 将 3 分解成两个正整数的和, 有两种分解方法, 分别是 312312 和 321321 。注意顺序不同算不同的方法。 将 5 分解成三个正整数的和, 有 6 种分解方法, 它们是 113122113122 131212221311131212221311 。 请问, 将 2021 分解成五个正整数的和, 有多少种分解方法? …

Android大厂面试100题,涵盖测试技术、环境搭建、人力资源

测试技术面试题 1、什么是兼容性测试?兼容性测试侧重哪些方面? 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 3、测试的策略有哪些? 4、正交表测试用例…

Sinutrain下载安装与开启OPC UA---kalrry

Sinumerik下载安装与开启OPC UA---kalrry前言一、安装前准备二、Win7安装1、软件安装2、开启授权3、文件配置4、客户端连接三、Win10/11安装四、启动后使用前言 本教程只适用于 Sinutrain-v4.7 版本,其他版本配置目录有所改变建议安装到默认路径,否则后…

【云原生】k8s安全机制

内容预知 前言 1. 认证(Authentication) 1.1 k8s集群内的三种认证方式 1.2 k8s集群内的认证说明 (1)需要被认证的访问类型 (2)安全性说明 (3)证书颁发的方式 (4&a…

Qt中使用qt自带的函数实现各种进制间的相互转换,easy.

文章目录一.十进制转各种进制第一种:使用QString的静态函数number第二种:使用QString的拼接函数arg二.各种进制相互转换一.十进制转各种进制 第一种:使用QString的静态函数number ①使用QString的静态函数number即可,如我把字符…

嵌入式linux-进程状态与进程关系

1. 进程状态 1.1什么是进程状态 Linux 系统下进程通常存在 6 种不同的状态,分为:就绪态、运行态、僵尸态、可中断睡眠状态(浅度 睡眠)、不可中断睡眠状态(深度睡眠)以及暂停态。 下面我们来一一总结一下&…

数据湖之Hudi基础:入门介绍和编译部署

主要记录下Hudi的概述和打包编译等内容,方便参考 文章目录简介官网发展历史Hudi特性使用场景安装部署编译环境准备编译hudi1.源码包上传到服务器2.修改pom文件3.修改源码兼容hadoop34.手动安装kafka依赖(非必须)5.解决spark模块依赖冲突6.执行…

【基础篇】4 # 链表(上):如何实现LRU缓存淘汰算法?

说明 【数据结构与算法之美】专栏学习笔记 链表结构 数组需要一块连续的内存空间来存储,对内存的要求比较高, 而链表并不需要一块连续的内存空间,它通过指针将一组零散的内存块串联起来使用。 结点:指的是内存块后继指针 next…