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

news2025/1/11 14:20:15

文章目录

  • 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端口

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

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

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

相关文章

行情不好,程序员的路在哪里?

最近有人提问,行情不好,程序员的路在哪里?今天的文章从远程工作、市场和流量思维、新技术、自媒体几个维度来讲讲。 远程工作 如果你在二三线城市,机会比较少,可以考虑一下远程工作。找一份美国或欧洲的远程工作&…

开源网安受邀参加网络空间安全合作与发展论坛,为软件开发安全建设献计献策

​11月10日,在广西南宁举办的“2023网络空间安全合作与发展论坛”圆满结束。论坛在中国兵工学会的指导下,以“凝聚网络空间安全学术智慧,赋能数字经济时代四链融合”为主题,邀请了多位专家及企业代表共探讨网络安全发展与数字经济…

助力燃气安全运行:智慧燃气管网背景延展

关键词:城市燃气管网、智慧燃气管网、智慧管网、智慧燃气管网解决方案、智慧燃气 01背景 当前,随着我国城市化进程不断加快,城市燃气管网也不断延伸,运行规模庞大,地下管线复杂,不少城市建设“重地上轻地…

Web后端开发_01

Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet,DispatcherServlet实现了servlet中规范的接口 请求响应: 请求(HttpServletRequest):获取请求数据响应(HttpServletRe…

2011年09月29日 Go生态洞察:image/draw包的深度解析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

会展服务预约小程序的作用如何

不少场景都会有会展服务需求,比如婚宴、年会、展会等,往往需要租订场地,不同地域不同时间地点等,尤其大城市需求频次较高。 但在实际经营中,会员服务企业面临着一些难题。对多数企业来讲,线上是不可或缺的…

地面沉降监测站可以监测什么?

随着城市化的飞速发展,地面沉降问题日益凸显。为了及时掌握土地沉降情况,确保人们安全,就需要借助地面沉降监测站的力量。 一、实时监测土地沉降 地面沉降监测站的核心功能是实时监测土地沉降。通过高精度GNSS位移监测站和先进的数据分析技术…

使用Java实现一个简单的贪吃蛇小游戏

一. 准备工作 首先获取贪吃蛇小游戏所需要的头部、身体、食物以及贪吃蛇标题等图片。 然后,创建贪吃蛇游戏的Java项目命名为snake_game,并在这个项目里创建一个文件夹命名为images,将图片素材导入文件夹。 再在src文件下创建两个包&#xff0…

性能压测工具:Locust详解

一、Locust介绍 开源性能测试工具https://www.locust.io/,基于Python的性能压测工具,使用Python代码来定义用户行为,模拟百万计的并发用户访问。每个测试用户的行为由您定义,并且通过Web UI实时监控聚集过程。 压力发生器作为性…

在Android上使用Jetpack Compose定制下拉刷新

在Android上使用Jetpack Compose定制下拉刷新 在Jetpack Compose中向LazyList添加下拉刷新非常简单。说真的,只需几行代码。然而,默认的外观和感觉并不是那么令人满意。我们希望做得更好一些,类似于iOS版本:当用户向下拉动列表时…

opencv差值法检测移动物体代码

void CrelaxMyFriendDlg::OnBnClickedOk() {hdc this->GetDC()->GetSafeHdc();// TODO: 在此添加控件通知处理程序代码string addrImg "c:/Users/actorsun/Pictures/";string addrVideo "c:/Users/actorsun/Videos/";string addr addrVideo &qu…

使用阿里云服务器学习Docker

首先我这里选择的系统服务器是CentOS 7.9 64位 因为centos系统里面的安装指令是:yum,而非apt-get. yum install docker -y试着建立一个容器: docker run -d -p 80:80 httpd启动docker的守护进程: sudo systemctl start docker 查看Docke…

基于springboot实现结合疫情情况的婚恋系统【项目源码】计算机毕业设计

基于springboot实现结合疫情情况的婚恋系统演示 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计,其不仅继承了Spring框架原来有的优秀特性,而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在原…

人机功能分配困难的原因之一

人机功能分配困难的原因之一是人类与机器都不能同时确定事实与价值的大小。事实是指客观存在的数据、信息和情况,而价值是指对这些事实的评判和喜好。人类和机器在确定功能分配时,都需要考虑到这两个方面。 首先,人类和机器在事实方面的认知能…

​ArcGIS Pro怎么生成山顶点

山顶点是指山脉、山丘或山脉系统中最高的地点,通常是山的最高峰,这是山地地貌中的最高点,往往是山脉的标志性特征之一,这里为大家介绍一下如何使用ArcGIS Pro获取山顶点,希望能对你有所帮助。 数据来源 本教程所使用…

axios1.5取消请求,中断请求的方法

给input的onchange绑定事件 引入axios,使用axios.CancelToken.source()创建标记 实例中,把cancelToken的值填上

Windows配置wxWidgets开发

1、编译 从官网下载wxWidgets源码,解压后进入build/msw目录,按自己安装的VS版本去选择sln打开,在VS的菜单拦找到【生成】菜单下的【批生成】菜单,点击进入, 点选【全选】然后点【生成】按钮。等上两、三个小时在项目目录的lib文件夹就可以看到生成的dll与lib目录,如下: …

【C语法学习】23 - strlen()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例1 1 函数原型 strlen():计算指针str所指向的字符串的长度,函数原型如下: size_t strlen(const char *str);2 参数 strlen()函数只有一个参数str: 参数str是指向待计算长度的字…

机器学习算法实战实战案例代码详解

文章目录 1.问题建模数据预处理 结果分析数据探索特征工程特征选择模型融合 1.问题建模 导入库 import numpy as np import pandas as pd from sklearn.model_selection import KFold from sklearn.metrics import mean_squared_error from sklearn.preprocessing import One…

包装类、自动装箱、自动拆箱是什么?有哪些注意点?

1、包装类 Java中的数据类型总体上分为基本数据类型和引用数据类型。引用类型的数据可以通过对象的属性和方法来进行操作,但对于基本数据类型的数据,我们能不能像操作对象那样来操作呢?为了实现这个目标,Java为8种基本数据类型分…