Python aiohttp 全面指南:异步HTTP客户端/服务器框架

边写代码零食不停口 盼盼麦香鸡味块 、卡乐比(Calbee)薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸

边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士+【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵

别光顾写代码更要多喝茶水,提神有营养 六安瓜片茶叶茶香二级200g 2025年新茶雨前盒装自己喝

让AI成为我们的得力助手:《用Cursor玩转AI辅助编程——不写代码也能做软件开发》

Python 图书推荐

书名出版社推荐
Python编程 从入门到实践 第3版(图灵出品)人民邮电出版社★★★★★
Python数据科学手册(第2版)(图灵出品)人民邮电出版社★★★★★
图形引擎开发入门:基于Python语言电子工业出版社★★★★★
科研论文配图绘制指南 基于Python(异步图书出品)人民邮电出版社★★★★★
Effective Python:编写好Python的90个有效方法(第2版 英文版)人民邮电出版社★★★★★
Python人工智能与机器学习(套装全5册)清华大学出版社★★★★★

JAVA 图书推荐

书名出版社推荐
Java核心技术 第12版:卷Ⅰ+卷Ⅱ机械工业出版社★★★★★
Java核心技术 第11版 套装共2册机械工业出版社★★★★★
Java语言程序设计基础篇+进阶篇 原书第12版 套装共2册机械工业出版社★★★★★
Java 11官方参考手册(第11版)清华大学出版社★★★★★
Offer来了:Java面试核心知识点精讲(第2版)(博文视点出品)电子工业出版社★★★★★

什么是 aiohttp?

aiohttp 是一个基于 Python asyncio 的异步 HTTP 客户端/服务器框架,专为高性能网络编程设计。它提供了:

  1. 异步 HTTP 客户端(类似异步版 requests)
  2. 异步 HTTP 服务器(类似异步版 Flask/Django)
  3. 完整的 WebSocket 支持
  4. 高效的连接池管理

核心优势

特性描述
异步非阻塞单线程处理数千并发连接
高性能远超同步框架(如 requests)的吞吐量
轻量级简洁的API,无复杂依赖
全面协议支持HTTP/1.1, HTTP/2(客户端), WebSocket
生态完善良好文档和活跃社区

基础用法 - HTTP客户端

安装

pip install aiohttp

基本GET请求

import aiohttp
import asyncioasync def main():async with aiohttp.ClientSession() as session:async with session.get('https://api.example.com/data') as response:print("状态码:", response.status)print("响应内容:", await response.text())asyncio.run(main())

POST请求示例

async def post_example():async with aiohttp.ClientSession() as session:# 表单数据async with session.post('https://httpbin.org/post', data={'key': 'value'}) as response:print(await response.json())# JSON数据async with session.post('https://api.example.com/users',json={'name': 'Alice', 'age': 30}) as response:print(await response.json())

高级用法

并发请求

async def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def concurrent_requests():urls = ['https://api.example.com/item/1','https://api.example.com/item/2','https://api.example.com/item/3']tasks = [fetch(url) for url in urls]results = await asyncio.gather(*tasks)for url, content in zip(urls, results):print(f"{url}: {content[:50]}...")asyncio.run(concurrent_requests())

超时控制

async def timeout_example():timeout = aiohttp.ClientTimeout(total=5)  # 5秒总超时async with aiohttp.ClientSession(timeout=timeout) as session:try:async with session.get('https://slow-api.example.com') as response:return await response.text()except asyncio.TimeoutError:print("请求超时!")

流式处理大响应

async def stream_response():async with aiohttp.ClientSession() as session:async with session.get('https://large-file.example.com') as response:with open('large_file.txt', 'wb') as f:async for chunk in response.content.iter_chunked(1024):f.write(chunk)print(f"已接收 {len(chunk)} 字节")

服务器端开发

基本HTTP服务器

from aiohttp import webasync def handle(request):name = request.match_info.get('name', "World")return web.Response(text=f"Hello, {name}!")app = web.Application()
app.add_routes([web.get('/', handle),web.get('/{name}', handle)
])if __name__ == '__main__':web.run_app(app, port=8080)

REST API示例

async def get_users(request):users = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]return web.json_response(users)async def create_user(request):data = await request.json()# 实际应用中这里会保存到数据库return web.json_response({'id': 3, **data}, status=201)app = web.Application()
app.add_routes([web.get('/api/users', get_users),web.post('/api/users', create_user)
])

WebSocket服务器

async def websocket_handler(request):ws = web.WebSocketResponse()await ws.prepare(request)async for msg in ws:if msg.type == aiohttp.WSMsgType.TEXT:if msg.data == 'close':await ws.close()else:await ws.send_str(f"ECHO: {msg.data}")elif msg.type == aiohttp.WSMsgType.ERROR:print('WebSocket连接异常关闭')return wsapp.add_routes([web.get('/ws', websocket_handler)])

进阶扩展

中间件示例

async def auth_middleware(app, handler):async def middleware(request):# 验证API密钥if request.headers.get('X-API-Key') != 'SECRET_KEY':return web.json_response({'error': 'Unauthorized'}, status=401)return await handler(request)return middlewareapp = web.Application(middlewares=[auth_middleware])

HTTP/2客户端支持

async def http2_request():conn = aiohttp.TCPConnector(force_close=True, enable_cleanup_closed=True)async with aiohttp.ClientSession(connector=conn) as session:async with session.get('https://http2.akamai.com/',headers={'accept': 'text/html'}) as response:print("HTTP版本:", response.version)print("内容:", await response.text()[:200])

性能优化配置

# 自定义连接器配置
connector = aiohttp.TCPConnector(limit=100,  # 最大并发连接数limit_per_host=20,  # 单主机最大连接数ssl=False,  # 禁用SSL验证(仅用于测试)force_close=True  # 避免连接延迟关闭
)# 自定义会话配置
session = aiohttp.ClientSession(connector=connector,timeout=aiohttp.ClientTimeout(total=30),headers={'User-Agent': 'MyApp/1.0'},cookie_jar=aiohttp.CookieJar(unsafe=True)
)

最佳实践

  1. 重用ClientSession:避免为每个请求创建新会话
  2. 使用连接池:合理配置TCPConnector参数
  3. 超时设置:总是配置合理的超时时间
  4. 资源清理:使用async with确保资源释放
  5. 错误处理:捕获并处理常见网络异常
    try:async with session.get(url) as response:response.raise_for_status()return await response.json()
    except aiohttp.ClientError as e:print(f"请求错误: {e}")
    

完整示例

import aiohttp
import asyncio
from aiohttp import web# 客户端示例
async def fetch_data():async with aiohttp.ClientSession() as session:# 并发请求多个APIurls = ['https://jsonplaceholder.typicode.com/posts/1','https://jsonplaceholder.typicode.com/comments/1','https://jsonplaceholder.typicode.com/albums/1']tasks = []for url in urls:tasks.append(session.get(url))responses = await asyncio.gather(*tasks)results = []for response in responses:results.append(await response.json())return results# 服务器示例
async def handle_index(request):return web.Response(text="Welcome to aiohttp server!")async def handle_api(request):data = await fetch_data()return web.json_response(data)# 创建应用
app = web.Application()
app.add_routes([web.get('/', handle_index),web.get('/api', handle_api)
])# 启动服务器
async def start_server():runner = web.AppRunner(app)await runner.setup()site = web.TCPSite(runner, 'localhost', 8080)await site.start()print("Server running at http://localhost:8080")# 保持运行while True:await asyncio.sleep(3600)  # 每小时唤醒一次if __name__ == '__main__':asyncio.run(start_server())

总结

aiohttp 是 Python 异步生态中处理 HTTP 通信的首选工具,它提供了:

  1. 高效客户端:用于高性能爬虫、API调用
  2. 轻量级服务器:构建高性能Web服务和API
  3. WebSocket支持:实现实时双向通信
  4. 连接池管理:优化资源利用率

通过合理利用 aiohttp 的异步特性,开发者可以轻松构建出能够处理数万并发连接的高性能网络应用,同时保持代码的简洁性和可维护性。

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

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

相关文章

归并排序:高效稳定的分治算法

归并排序 归并排序采用分治策略实现稳定排序&#xff0c;其核心思想是将序列递归分解后进行有序合并。 def merge_sort(arr):if len(arr) < 1:return arrmid len(arr) // 2left merge_sort(arr[:mid])right merge_sort(arr[mid:])result []i j 0while i < len(le…

go语言基础|slice入门

slice slice介绍 slice中文叫切片&#xff0c;是go官方提供的一个可变数组&#xff0c;是一个轻量级的数据结构&#xff0c;功能上和c的vector&#xff0c;Java的ArrayList差不多。 slice和数组是有一些区别的&#xff0c;是为了弥补数组的一些不足而诞生的数据结构。最大的…

网络攻防技术九:网络监听技术

文章目录 一、网络监听概述二、网络流量劫持三、数据采集与解析四、网络监听检测与防范1、检测实施监听主机2、防范网络通信被监听 一、网络监听概述 主要解决问题&#xff1a;网络流量劫持、在监听点上采集并分析网络数据。主要涉及网卡数据采集、协议分析技术。 二、网络流量…

Cat.1与Cat.4区别及应用场景

Cat.1 和 Cat.4 都是 LTE&#xff08;4G&#xff09;网络中的终端设备类别&#xff0c;主要区别在于 数据传输速率、复杂度和功耗&#xff0c;这直接影响了它们的应用场景和成本。 以下是它们的主要区别&#xff1a; 数据传输速率 (核心区别)&#xff1a; Cat.1 (Category 1)&…

【后端高阶面经:架构篇】51、搜索引擎架构与排序算法:面试关键知识点全解析

一、搜索引擎核心基石&#xff1a;倒排索引技术深度解析 &#xff08;一&#xff09;倒排索引的本质与构建流程 倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎实现快速检索的核心数据结构&#xff0c;与传统数据库的正向索引&#xff08;文档→关键词&#xff0…

深度学习入门:从零搭建你的第一个神经网络

深度学习入门&#xff1a;从零搭建你的第一个神经网络 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 深度学习入门&#xff1a;从零搭建你的第一个神经网络摘要引言第一章&#xff1a;神经网络基础原理1.1 神经元…

Hadoop 3.x 伪分布式 8088端口无法访问问题处理

【Hadoop】YARN ResourceManager 启动后 8088 端口无法访问问题排查与解决(伪分布式启动Hadoop) 在配置和启动 Hadoop YARN 模块时&#xff0c;发现虽然 ResourceManager 正常启动&#xff0c;JPS 进程中也显示无误&#xff0c;但通过浏览器访问 http://主机IP:8088 时却无法打…

docker B站学习

镜像是一个只读的模板&#xff0c;用来创建容器 容器是docker的运行实例&#xff0c;提供了独立可移植的环境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目录挂载 尚硅谷doc…

鸿蒙OSUniApp微服务架构实践:从设计到鸿蒙部署#三方框架 #Uniapp

UniApp微服务架构实践&#xff1a;从设计到鸿蒙部署 引言 在最近的一个大型跨平台项目中&#xff0c;我们面临着一个有趣的挑战&#xff1a;如何在UniApp框架下构建一个可扩展的微服务架构&#xff0c;并确保其在包括鸿蒙在内的多个操作系统上流畅运行。本文将分享我们的实践…

Freemarker快速入门

Freemarker概述 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c…

操作系统:生态思政

操作系统&#xff1a;生态思政 操作系统&#xff08;OS&#xff09;作为数字世界的基石&#xff0c;其意义远超单纯的技术平台。它构建了一个包含开发者、用户、硬件厂商在内的复杂生态系统&#xff0c;其设计理念、运行规则与生态治理模式&#xff0c;无不深刻映射着特定的价…

二进制安全-OpenWrt-uBus

1 需求 需求&#xff1a;ubus list 需求&#xff1a;ubus -v list 需求&#xff1a;ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …

Rust 学习笔记:自定义构建和发布配置

Rust 学习笔记&#xff1a;自定义构建和发布配置 Rust 学习笔记&#xff1a;自定义构建和发布配置发布配置文件自定义 profile 的选项 Rust 学习笔记&#xff1a;自定义构建和发布配置 发布配置文件 在 Rust 中&#xff0c;发布配置文件是预定义的和可定制的概要文件&#xf…

优化 Transformer 模型:基于知识蒸馏、量化技术及 ONNX

Transformer 模型非常强大&#xff0c;但往往太大太慢&#xff0c;不适合实时应用。为了解决这个问题&#xff0c;我们来看看三种关键的优化技术&#xff1a;知识蒸馏、量化和ONNX 图优化。这些技术可以显著减少推理时间和内存使用。 为了说明每种技术的利弊&#xff0c;我们以…

Vue3中Axios的使用-附完整代码

前言 首先介绍一下什么是axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests 官方网站…

@Pushgateway自定义脚本推送数据

文章目录 Pushgateway 自定义脚本推送数据1. 目的2. 适用范围3. 前提条件4. 操作流程4.1 确定指标类型和格式4.2 编写推送脚本方法一:使用 curl 命令行推送方法二:使用 Python 脚本推送方法三:使用 Python 客户端库推送4.3 设置定时任务4.4 验证数据5. 高级配置5.1 使用基本…

Git 使用规范指南

Learn Git Branching 1Git 基础使用流程 1.1初始化与克隆 # 初始化本地仓库 git init# 克隆远程仓库 git clone <repo_url> 一般拉取代码&#xff0c;直接在文件夹界面打开bash&#xff0c;git clone就行了 1.2日常开发流程 1拉取最新代码 git pull origin <branc…

设计模式——备忘录设计模式(行为型)

摘要 备忘录设计模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获对象的内部状态并在需要时恢复。它包含三个关键角色&#xff1a;原发器&#xff08;Originator&#xff09;、备忘录&#xff08;Memento&#xff09;和负责人&#xff08;Car…

动态规划十大经典题型状态转移、模版等整理(包括leetcode、洛谷题号)

动态规划十大经典题目整理 0-1 背包问题&#xff08;0-1 Knapsack Problem&#xff09; LeetCode题号&#xff1a;无直接对应洛谷OJ题号&#xff1a;P1048状态转移方程&#xff1a;dp[j] max(dp[j], dp[j - weight[i]] value[i])C代码模板&#xff1a; int dp[capacity 1…

简单transformer运用

通俗易懂解读&#xff1a;hw04.py 文件内容与 Transformer 的应用 这个文件是一个 Python 脚本&#xff08;hw04.py&#xff09;&#xff0c;用于完成 NTU 2021 Spring 机器学习课程的 HW4 作业任务&#xff1a;扬声器分类&#xff08;Speaker Classification&#xff09;。它…