【异步并发编程】使用aiohttp构建Web应用程序

文章目录

  • 1. 写在前面
  • 1. 什么是aiohttp?
    • 1.1. 什么是异步编程?
  • 2. 安装aiohttp
  • 3. 异步HTTP服务器
  • 4. 异步请求
  • 5. aiohttp REST实例

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  平时我们在使用Pythohn去开发REST API接口的时候,大部分人都会选择Flask、FastApi、Django

今天将使用aiohttp,一个基于异步I/O的Python框架,来构建REST API,相比于传统的同步框架Flask,看看它所带来的效果

在这里插入图片描述

1. 什么是aiohttp?

  aiohttp是Python中一款优秀的异步Web框架,它能够帮助我们构建高效的异步Web应用和异步HTTP客户端。允许我们同时处理大量并发请求,而不会阻塞程序执行。aiohttp使用Python的 async/await语法来实现异步编程,使得开发者能够轻松处理高并发的 I/O 操作,特别适用于构建需要实时性和高性能的应用程序,比如 Web 服务器、RESTful API、实时通信系统

关键组件与说明:

  • 异步I/O:aiohttp利用Python的asyncio实现了异步I/O操作,允许在单个线程中处理多个并发操作,提高了应用程序的性能
  • HTTP客户端:提供了强大的异步HTTP客户端,支持异步请求和响应,适用于与其他服务进行异步通信,例如调用RESTful API
  • HTTP服务器:内置了一个异步的HTTP服务器,可用于构建高性能的We 服务。它支持异步请求处理,使得服务器能够同时处理多个连接
  • WebSocket支持:aiohttp原生支持WebSocket 协议,方便构建实时通信和推送功能。
  • 中间件和拦截器: 提供了中间件和拦截器的支持,允许在请求处理的不同阶段添加自定义逻辑,增强了框架的可扩展性
  • 路由系统:支持定义灵活的路由,使得构建RESTful API 变得直观和简单

1.1. 什么是异步编程?

  这里我们用大白话,举例说一下到底什么是异步编程??首先我们想象一下,传统同步编程就像是在等公交车的排队,每个人都得按顺序上车,哪怕前面的人需要等待很长时间。但是异步编程就像是你在等待公交的时候,看到了一辆共享单车,你可以先骑着单车走一段路,不必等到公交来了再上车。这样一来,你既能享受风景,又能更高效地前行,同时不会傻傻地站在那里等待

  在传统同步编程中,一个任务的执行需要等待,就像大家得按次序上车一样,一旦有任务在等待,整个程序就像是陷入了拥堵,其他任务也只能束手待毙。但异步编程就不一样,它就像是程序里有了一些"超能力",当有任务需要等待时,它会像变魔术一样,让其他任务继续前行。这样就好比在拥挤的城市中,你能够巧妙地绕过人群,灵活自如地到达目的地,同时不受拥堵的影响。

所以,异步编程不仅是更高效的程序运行方式,更是一种程序的"超能力",让你的代码可以更灵活、更迅速地应对各种任务,就像是给你的程序穿上了一双闪电之靴,让它在处理任务时更为迅猛,不再受制于传统的等待方式

在 Python 的异步编程中,使用async/await来声明异步函数和执行异步操作。使用async关键字定义一个函数时,它将返回一个协程对象,而使用await关键字可以在协程中等待其他协程执行完成

  • 协程 (Coroutine):协程是一种可以暂停执行并在稍后恢复的函数,它允许我们在函数内部进行状态保存。在异步编程中,协程非常有用,因为它们允许我们在等待I/O操作的同时,执行其他任务
  • 事件循环 (Event Loop):事件循环是异步编程的核心,它是一个循环结构,负责不断地监听并处理事件。在Python中,可以使用asyncio模块提供的事件循环来驱动异步协程的执行

2. 安装aiohttp

在开始使用aiohttp之前,我们需要先安装它。可以使用pip进行安装:

1、检查python版本:

$ python3 -V
Python 3.9.7

2、安装aiohttp:

$ pip3 install aiohttp

3、检aiohttp版本号:

$ python3 -c "import aiohttp; print(aiohttp.__version__)"
3.7.4

3. 异步HTTP服务器

  aiohttp提供了两个关键模块:aiohttp.webaiohttp.client,分别用于构建 Web 应用程序和创建异步 HTTP 客户端

让我们先聚焦于aiohttp.web模块,它是构建异步Web应用程序的骨干。下面是一个简单而强大的异步HTTP服务器示例:

import asyncio
from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, 欢迎来到我的博客!")

app = web.Application()
app.router.add_get('/', handle)

# 手动启动事件循环
async def start_app():
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, 'localhost', 8080)
    await site.start()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(start_app())
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        loop.run_until_complete(loop.shutdown_asyncgens())
        loop.close()

运行以上代码,你将会看到aiohttp服务器已经在本地运行,并且正在监听默认端口。当你在浏览器中访问localhost+端口即可

4. 异步请求

  除了作为异步 Web 服务器,aiohttp 还为我们提供了强大的异步HTTP客户端,用于方便地向其他服务器发起异步请求。以下是一个简单而强大的例子:

import aiohttp
import asyncio

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

async def main():
    url = 'https://www.baidu.com'
    result = await fetch(url)
    print(result)

asyncio.run(main())

在上述代码中,我们定义了一个fetch函数,它利用aiohttp的 ClientSession对象发起一个异步的GET请求,并返回响应内容。在 main函数中,我们调用fetch函数并输出结果。

这个简单的例子展示了aiohttp如何轻松地使异步HTTP客户端请求变得简单。通过aiohttp的异步特性,我们可以高效地与其他服务器进行通信,而不会阻塞主程序的执行。这为构建异步、高性能的网络应用提供了一种便捷而强大的方式

5. aiohttp REST实例

  REST(Representational State Transfer)是现代Web应用程序开发中广泛使用的规范,尤其是在与具有React和Vue等框架的单页应用程序结合使用时。REST提供了一种无状态、结构化的设计方式,独立于客户端技术,使得Web API的开发更为简便。REST API应该能够与从手机到浏览器的任意数量的客户端进行互操作,并且只需要更改数据的客户端表示即可。

在REST中,关键概念是资源。资源通常可以用名词表示,例如客户、产品或账户,它们可以是RESTful资源。资源可以是单个实例,如单个客户或产品,也可以是集合。例如,具有一些唯一标识符的单个客户或产品可以被视为集合中的一个资源。此外,资源也可能有子资源。以客户的最喜欢产品列表为例,这个列表就是客户的子实体。以下是几个REST API的示例,以更好地理解这些概念:

customers
customers/{id}
customers/{id}/favorites

这里有三个REST API端点。第一个端点customers代表一组客户,我们期望它返回一个客户列表。第二个端点代表一个客户,并通过{id}参数指定客户的唯一标识符。调用customers/1将返回id为1的客户的数据。最后一个端点是子实例的示例,即客户的收藏列表。调用 customers/1/favorites 将返回id为1的客户的收藏列表。

设计REST API时,通常选择使用JSON作为数据格式,因为这是典型的用法。虽然REST API有时可以通过HTTP标头的设置来支持多种数据表示,但理解REST的所有细节将有助于更好地应用这一设计方式

from aiohttp import web
import json

async def get_users(request):
    users = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]
    return web.json_response(users)

async def get_user(request):
    user_id = request.match_info['id']
    user = {'id': int(user_id), 'name': 'User ' + user_id}
    return web.json_response(user)

app = web.Application()
app.router.add_get('/users', get_users)
app.router.add_get('/users/{id}', get_user)

if __name__ == '__main__':
    web.run_app(app, port=8080)

在这里插入图片描述

在这个示例中:

  • get_users函数用于处理获取用户列表的请求,返回一个包含用户信息的JSON响应
  • get_users函数用于处理获取特定用户信息的请求,根据请求中的用户ID返回对应用户的JSON响应
  • 其中创建了一个web.Application()对象,并通过app.router.add_get方法定义了两个端点,分别对应/users/users/{id}
  • 最后使用web.run_app启动应用,监听在本地的8080端口

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS:何为空指针和野指针

一:什么是空指针和野指针 1、空指针 ①.没有存储任何内存地址的指针就成为空指针(NULL指针) ②.空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. //以下都是空指针,eg: Person *p1 NULL; …

Linux上C++通过LDAP协议使用kerberos认证AES加密连接到AD服务器

一.前言 记录自己在实现这个流程遇到的各种问题,因为我也是看了许多优质的文章以及组内大佬的帮助下才弄成的,这里推荐一个大佬的文章,写的非常优秀,比我这篇文章写得好得很多,最后我也是看这个大佬的代码最终才实现的…

一行JavaScrip可以做什么?

说在前面 JavaScript 提供了许多方便的方法和操作符来简化常见的任务,使得编程变得更加高效和便捷。无论是数学计算、字符串处理还是数据操作,JavaScript 都能帮助我们以简洁的方式实现所需功能。 代码 1、生成指定范围内的随机整数 const randomInt …

部分背包问题【贪心算法】

部分背包问题是一种经典的贪心问题,物品可以取一部分,也就是可以随意拆分的物品。 算法思路: 用列表保存每个物品的价值及总重量、平均价值(性价比)。输入数据同时计算每种物品的平均价值。使用自定义的compare函数以…

2023亚太杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

苹果独占鳌头,国产手机围攻,双十一“照妖镜”显露谁有真实力

随着双十一购物节的结束,电商平台也给出了各手机品牌的销量数据,苹果毫无疑问成为双十一的赢家,不过两家国产手机品牌也显露了他们的实力,已具有与苹果一战之力。 与去年双十一和今年618类似,苹果仍然占据热销榜前列&a…

信驰达科技加入车联网联盟(CCC),推进数字钥匙发展与应用

CCC)的会员。 图 1 深圳信驰达正式成为车联网联盟(CCC)会员 车联网联盟(CCC)是一个跨行业组织,致力于推动智能手机与汽车连接解决方案的技术发展。CCC涵盖了全球汽车和智能手机行业的大部分企业,拥有150多家成员公司。CCC成员公司包括智能手机和汽车制造…

TLP超线程技术

在实现IPL指令级并行的同时实现TLP(Thread Level Parallelism)线程级并行实现多线程有两种主要的方法超线程即同时多线程,在单个处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件当两个线程同时需要某个资源时,其中一个线程必…

Mac 本地部署thinkphp8【配置环境】

PHP开发工具 我这里选择的是VSCode,里面安装PHP插件 把thinkphp的项目放到 切换到phpenv ![在这里插入图片描述](https://img-blog.csdnimg.cn/a15cc442fab74754ad86d74f6d9942e5.png URL重写如果不改,在请求的时候地址是这样的‘http://tp.com/index.php…

Prim算法(C++)

目录 介绍: 代码: 结果: 介绍: Prim算法是一种用于解决最小生成树问题的贪心算法。该算法的主要思想是从一个顶点开始,不断向图中添加边,直到构成一棵包含所有顶点的生成树,使得树的边权之…

安全认证框架Shrio学习,入门到深度学习,SpringBoot整合Shiro小案例,含代码

权限概述 什么是权限 什么是权限 权限管理,一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 权限管理再系统中一般分…

麒麟信安:助力医疗行业操作系统自主创新,提升可靠性与安全性

应用场景 湖南省康复医院是省卫生健康委直属公立三级康复医院,也是全省唯一一所集预防、医疗、康复、科研、教学、健康管理为一体的省级三级公立康复医院。 湖南省康复医院使用的医慧管平台由湖南蓝途方鼎科技有限公司开发,利用互联网技术,…

卫星通信和800MHz双管齐下,中国电信对中国移动发起新挑战

依靠国内某科技企业的宣传,卫星通信大热,中国电信也由此成为受益者,日前中国电信又大举招标25万座800MHz 5G基站,显示出中国电信积极以技术优势挑战中国移动。 一、中国电信急起直追 自从4G时代以来,中国电信就在国内通…

EXTI (2)

增强版实验简介 EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源 改变引脚 PA0和PA1改变为PA5 和PA6 EXTI的重映射 之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上 EXTI进行初始化 NVIC初始化 编写中断函数 因为EXTI…

Apktool反编译和重新打包

Apktool 使用 1:linux安装apktool 可以直接查询下version apktool -v 如果未安装,会得到如下结果: Command apktool not found, but can be installed with:sudo snap install apktool # version 2.7.0, or sudo apt install apktool …

SSH全能终端工具mobaXterm(远程工具)使用教程

参考文章:SSH全能终端工具MobaXterm Personal v23.0 完全汉化绿色版 参考文章:MobaXterm 23终端控制软件 文章目录 SSH全能终端工具mobaXterm使用教程目录引言mobaXterm概述安装与配置下载mobaXterm安装过程基础设置 SSH连接创建SSH会话SSH命令行操作文…

Linux 源码包安装

SRPM 包,比 RPM 包多了一个“S”,是“Source”的首字母,所以 SRPM 可直译为“源代码形式的 RPM 包”。也就是说,SRPM 包中不再是经过编译的二进制文件,都是源代码文件。可以这样理解,SRPM 包是软件以源码形…

力扣周赛371复盘(总结与进步)

比赛结果 第一题 2932. 找出强数对的最大异或值 I - 力扣&#xff08;LeetCode&#xff09; 这个由于是简单题&#xff0c;暴力for循环即可 通过结果如下&#xff1a; class Solution {public int maximumStrongPairXor(int[] nums) {int ans0;for(int i 0;i<nums.length;…

Python 日志记录器logging 百科全书 之 日志回滚

Python 日志记录器logging 百科全书 之 日志回滚 前言 在之前的文章中&#xff0c;我们学习了关于Python日志记录的基础配置。 本文将深入探讨Python中的日志回滚机制&#xff0c;这是一种高效管理日志文件的方法&#xff0c;特别适用于长时间运行或高流量的应用。 知识点&…

深入了解springmvc响应数据

目录 一、前后端分离开发与混合开发 1.1 混合开发模式 1.2 前后端分离模式【重点】 二、页面跳转控制 2.1 通过JSP实现页面跳转 2.2 转发与重定向 三、返回JSON数据 3.1 导包与配置 3.2 使用ResponseBody 四、返回静态资源 4.1 为什么无法直接查询静态资源 4.2 配置…