一文学会Aiohttp

news2025/1/25 4:40:05

一、什么是aiohttp库

aiohttp库官网:https://docs.aiohttp.org/en/stable/

        aiohttp是一个Python的HTTP客户端/服务器框架,它基于asyncio库实现异步编程模型,可以支持高性能和高并发的HTTP通信。aiohttp用于编写异步的Web服务器、Web应用程序或HTTP客户端,以提供对Web和HTTP资源的访问和操作。

        在aiohttp中,HTTP客户端提供了一种发送HTTP请求和处理响应的异步方式,而HTTP服务器则提供了一种异步处理HTTP请求和响应的方式。在使用aiohttp编写Web应用程序时,我们可以选择使用内置的路由器和视图功能来处理HTTP请求,并使用异步模板引擎来渲染HTML页面。

        aiohttp支持WebSocket协议,使得我们可以轻松地在应用程序中实现实时通信和数据推送。aiohttp的API设计简单、易用,与Python开发者熟悉的asyncio风格一致。因此,即使没有使用过aiohttp也可以较快上手。 aipyhttp适用于那些需要高性能、高吞吐量、高并发的Python网络应用场景,如实时聊天、在线游戏、大数据分析等。

二、如何安装aiohttp

pip install aiohttp
import aiohttp

async def main():
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

    timeout = aiohttp.ClientTimeout(total=10) # 设置总超时时间为10秒

    async with aiohttp.ClientSession(headers=headers, timeout=timeout) as session:
        async with session.get('https://www.example.com/') as response:
            html = await response.text()
            print(html)

if __name__ == '__main__':
    asyncio.run(main())

三、请求和相应

1、post请求

服务器端代码

from aiohttp import web

async def handle(request):
    data = await request.post()
    name = data.get('name', "Anonymous")
    age = data.get('age', "Unknown")
    text = f"Hello, {name}, you're {age} years old."
    return web.Response(text=text)

app = web.Application()
app.add_routes([web.get('/', handle),
                web.post('/', handle)])

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

客户端代码

import aiohttp
import asyncio

async def post_data(session, url):
    data = {'name': 'John', 'age': 30}
    async with session.post(url, data=data) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await post_data(session, 'http://localhost:8080/')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

2、get请求

服务器端代码

from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    text = f"Hello, {name}"
    return web.Response(text=text)

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

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

客户端代码

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, 'http://localhost:8080/John')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

3、获取响应内容

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        # 获取状态码
        status = response.status
        
        # 获取响应头
        headers = response.headers
        
        # 以文本形式获取响应正文
        text = await response.text()
        
        # 以字节形式获取响应正文
        content = await response.read()
        
        return status, headers, text, content

async def main():
    async with aiohttp.ClientSession() as session:
        status, headers, text, content = await fetch(session, 'https://www.example.com')
        print(status)
        print(headers)
        print(text)
        print(content)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

四、Cookies和Session

from aiohttp import web

async def handle(request):
    session = await request.session()
    count = session.get('count', 0)
    count += 1
    session['count'] = count
    text = f"Visited {count} times."
    return web.Response(text=text)

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

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

启用服务起session功能

rom aiohttp import web

async def handle(request):
    session = await request.session()
    count = session.get('count', 0)
    count += 1
    session['count'] = count
    text = f"Visited {count} times."
    return web.Response(text=text)

app = web.Application()
app.add_routes([web.get('/', handle)])
app.cleanup_ctx.append(lambda app: setup_session(app))

async def setup_session(app):
    app['session'] = await aiohttp_session.setup(
        app, aiohttp_session.SimpleCookieStorage())

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

五、异步处理

1、协程

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://www.example.com')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

2、回调函数

import aiohttp
import asyncio

def handle_response(response):
    print(response.status)
    asyncio.get_event_loop().stop()

async def main():
    async with aiohttp.ClientSession() as session:
        url = 'https://www.example.com'
        async with session.get(url) as response:
            response.add_done_callback(handle_response)
            await asyncio.sleep(1)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

六、SSL认证

1、启动ssl认证

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://www.example.com') as response:
            print(await response.text())

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

2、使用自签名SSL证书的aiohttp示例

import aiohttp
import asyncio
import ssl

async def main():

    ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    ssl_context.load_verify_locations('/path/to/cert.pem')

    async with aiohttp.ClientSession() as session:
        async with session.get('https://www.example.com', ssl=ssl_context) as response:
            print(await response.text())

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

七、 WebSockets

        WebSocket是一种协议,用于在客户端和服务器之间进行实时双向通信。它允许数据在客户端和服务器之间以全双工方式流动,并且不需要使用HTTP请求/响应周期来发送数据。

        WebSocket通过在客户端和服务器之间建立持久连接来实现实时通信。这个连接是基于TCP协议的,但是与HTTP请求/响应不同,它只需要一个握手过程,就可以在客户端和服务器之间创建长期的连接

# 使用aiohttp实现WebSocket
import aiohttp
import asyncio

async def websocket_handler(request):

    ws = aiohttp.web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            await ws.send_str('Hello, ' + msg.data)
        elif msg.type == aiohttp.WSMsgType.ERROR:
            break

    return ws

app = aiohttp.web.Application()
app.add_routes([aiohttp.web.get('/', websocket_handler)])

if __name__ == '__main__':
    aiohttp.web.run_app(app)

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

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

相关文章

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通(第5版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章,…

Linux下文件操作函数

一.常见IO函数 fopen fclose fread fwrite fseek fflush fopen 运行过程 :打开文件 写入数据 数据写到缓冲区 关闭文件后 将数据刷新入磁盘 1.fopen 返回文件类型的结构体的指针 包括三部分 1).文件描述符(整形值 索引到磁盘文件)…

【重磅合作】九章云极DataCanvas公司与生态伙伴强强联手,构建人工智能强生态!

11月21日,在「筑基赋能 智向未来」九章云极DataCanvas大模型系列成果发布会上,九章云极DataCanvas公司与人工智能产业链上下游合作伙伴广东民营投资股份有限公司(以下简称“粤民投”)、西藏赛富合银投资有限公司(以下简…

网络入门---网络编程预备知识

目录标题 ifconfigip地址和mac地址的区别端口号pid和端口号UDP和TCP的初步了解网络字节序socket套接字 ifconfig 通过指令ifconfig便可以查看到两个网络接口: 我们当前使用的是一个linux服务器并是一个终端设备,所以他只需要一个接口用来入网即可&…

重排链表,剑指offerII 26,力扣 120

目录 力扣题目地址: 题目: 那我们直接看题解吧: 解题方法: 难度分析: 审题目事例提示: 解题分析: 解题思路: 解题补充: 力扣题目地址: 143. 重排链表 - 力扣&…

树与二叉树堆:堆的意义

目录 堆的意义: 第一是堆的排序,第二是堆的top k 排行问题 堆的 top k 排行问题: 面对大量数据的top k 问题: 堆排序的实现:——以升序为例 方法一 交换首尾: 建立大堆: 根结点尾结点的…

Python之数据可视化

文章目录 一、1、matplotlib简单应用1.1、绘制带有中文标签和图例的图1.2、 绘制散点图1.3、绘制饼状图1.4、多个图形一起显示 一、 1、matplotlib简单应用 matplotlib模块依赖于numpy模块和tkinter模块,可以绘制多种形式的图形,包括线图、直方图、饼状…

理解DALL-E 2

1.简介 DALL-E 2的效果想必大家都已经很清楚了,效果是非常惊人的,该篇文章就是讲一下DALL-E 2的原理是什么。 2.方法 DALL-E 2的原理不难理解,前提是你知道CLIP。简单来说,CLIP是一个由文本和图片多模态训练的一个zero-shot模型…

PTA-2023年软件设计综合实践_9(动态规划法)

7-1 数塔 数塔如图所示&#xff0c;若每一步只能走到相邻的结点&#xff08;图中有数字的方格&#xff09;&#xff0c;则从最顶层走到最底层所经过的所有结点的数字之和最大是多少&#xff1f;测试数据保证结果不大于231−1。 C #include <bits/stdc.h> using namespa…

15个超级实用的Python操作,肯定有你意想不到的!

文章目录 1&#xff09;映射代理&#xff08;不可变字典&#xff09;2&#xff09;dict 对于类和对象是不同的3) any() 和 all()4) divmod()5) 使用格式化字符串轻松检查变量6) 我们可以将浮点数转换为比率7) 用globals()和locals()显示现有的全局/本地变量8) import() 函数9) …

Flink-时间流与水印

时间流与水印 一、背景二、时间语义1.事件时间&#xff08;event time&#xff09;2.读取时间&#xff08;ingestion time&#xff09;3.处理时间&#xff08;processing time&#xff09; 三、水印-Watermarks1.延迟和正确性2.延迟事件3.顺序流4.无序流5.并行流 四、Windows1.…

【Openstack Train安装】八、placement安装

Placement 肩负着这样的历史使命&#xff0c;最早在 Newton 版本被引入到 openstack/nova repo&#xff0c;以 API 的形式进行孵化&#xff0c;所以也经常被称呼为 Placement API。它参与到 nova-scheduler 选择目标主机的调度流程中&#xff0c;负责跟踪记录 Resource Provide…

Windows下命令行启动与关闭WebLogic的相关服务

WebLogic 的服务器类型 WebLogic提供了三种类型的服务器&#xff1a; 管理服务器节点服务器托管服务器 示例和关系如下图&#xff1a; 对应三类服务器&#xff0c; 就有三种启动和关闭的方式。本篇介绍使用命令行脚本的方式启动和关闭这三种类型的服务器。 关于WebLogic 的…

洗地机哪个牌子好用?希亦、添可、石头洗地机品牌实测推荐!

现代家居生活中&#xff0c;普通的扫把拖把已经快要脱离了普通百姓家&#xff0c;人们纷纷使用智能扫地机洗地机等。 但是现在市场上洗地机的品牌参差不齐&#xff0c;很多不懂行的人不知道该选什么&#xff0c;那么什么洗地机的品牌质量好且耐用呢&#xff1f;下面笔者为大家…

Azure Machine Learning - 创建Azure AI搜索索引

目录 一、先决条件检查空间 二、创建和加载索引启动向导连接到 数据源跳过认知技能配置配置索引配置索引器 三、监视索引器进度四、检查搜索索引结果五、添加或更改字段六、使用搜索浏览器查询七、运行更多示例查询八、清理资源 在本文中&#xff0c;你将使用导入数据向导和由虚…

解决msvcr71.dll丢失5个方法,修复程序运行缺失dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr71.dll丢失”。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;给使用者带来了很大的困扰。那么&#xff0c;究竟是什么原因导致了msvcr71.dll文件的丢失呢&#xff1f;本文…

T-Rex:检测一切 | 基于视觉提示的开集检测器,检测并计数

图1. 我们引入了一个交互式对象计数模型T-Rex。给定参考图像上指定的框或点&#xff0c;T-Rex 可以检测目标图像上的所有与指定对象表现出相似模式的实例&#xff0c;然后将其相加得到计数结果。我们先通过T-Rex生成检测到框提示&#xff0c;再使用SAM得到mask&#xff0c;以获…

Android端极致画质体验之HDR播放

高动态范围HDR视频通过扩大亮度分量的动态范围(从100cd/m2到1000cd/m2)&#xff0c;以及采用更宽的色彩空间BT2020&#xff0c;提供极致画质体验。从Android10开始&#xff0c;支持HDR视频播放。 一、HDR技术 HDR技术标准包括&#xff1a;Dolby-Vision、HDR10、HLG、PQ。支持…

set与map

set与map 一、序列式容器与关联式容器二、pair1、键值对2、作用3、构造函数4、make_pair&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;作用 5、代码6、运行结果 三、set1、概念2、代码3、运行结果4、说明 四、multiset1、与set的关系2、代码3、运行结果 五、map…

鸿蒙系统扫盲(三):鸿蒙开发用什么语言?

1.两种开发方向 我们常说鸿蒙开发&#xff0c;但是其实鸿蒙开发分为两个方向&#xff1a; 一个是系统级别的开发&#xff0c;比如驱动&#xff0c;内核和框架层的开发&#xff0c;这种开发以C/C为主 还有一个是应用级别的开发&#xff0c;在API7以及以下&#xff0c;还是支持…