一文学会Aiohttp

一、什么是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 aiohttpasync 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 webasync 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 asyncioasync 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 webasync 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 asyncioasync 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 asyncioasync 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, contentasync 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 webasync def handle(request):session = await request.session()count = session.get('count', 0)count += 1session['count'] = counttext = 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 webasync def handle(request):session = await request.session()count = session.get('count', 0)count += 1session['count'] = counttext = 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 asyncioasync 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 asynciodef 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 asyncioasync 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 sslasync 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 asyncioasync 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:breakreturn wsapp = aiohttp.web.Application()
app.add_routes([aiohttp.web.get('/', websocket_handler)])if __name__ == '__main__':aiohttp.web.run_app(app)

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

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

相关文章

36 - 电商系统表设计优化案例分析

如果在业务架构设计初期,表结构没有设计好,那么后期随着业务以及数据量的增多,系统就很容易出现瓶颈。如果表结构扩展性差,业务耦合度将会越来越高,系统的复杂度也将随之增加。这一讲我将以电商系统中的表结构设计为例…

基于docker的onlyoffice使用--运行JavaSpringExample

背景 我之前看到有开源项目很好地集成了onlyoffice,效果要比kkfilepreview好(应当说应用场景不太一样)。本文是在window10环境,安装完Docker Desktop的基础上运行onlyoffice,并利用官网JavaSpringExample进行了集成。 …

java学习part24异常throws

127-异常处理-异常处理方式二:throws_哔哩哔哩_bilibili 1.方法throws 2.如何抉择try和throws 3.手动throw语句 抛出一些java语法上没错但是不符合实际情况的异常。 用throw手动抛,方法上必须加throws。除非是运行时异常。 4.自定义异常

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章,本文以自述的方式来讲解lmkd进程,通过本文您将了解到lmkd进程在安卓系统中存在的意义,以及它是如何杀进程的。(文中的代码是基于android13) 我是谁 init:“大…

Android控件全解手册 - 多语言切换完美解决方案(兼容7.0以上版本)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

在PyCharm中运行OpenCV

一、安装Anaconda配置python环境 这里选用清华大学开源软件镜像站:anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载的速度更快。 点击下载链接:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsin…

推荐一款好用的BMP转PNG工具BMP2PNG

推荐一款好用的BMP转PNG工具BMP2PNG 自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用, 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话,网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xf…

arthas使用

官方文档 Github: https://github.com/alibaba/arthas 文档: https://arthas.aliyun.com/doc/ Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断…

Qt MVC示例 simpletreemodel 树模型

Qt MVC示例 simpletreemodel 树模型 从文本中读取树模型数据&#xff0c;缩进代表子项 TreeItem 表示一行字符串数据 treeitem.h #ifndef TREEITEM_H #define TREEITEM_H#include <QList> #include <QVariant>//! [0] class TreeItem { public:explicit Tree…

如何手工获取并更新ESXi中macOS的VMware Tools版本

正文共&#xff1a;1128 字 22 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如何在VMware ESXi创建macOS虚拟机&#xff08;VMware ESXI部署macOS Monterey&#xff09;&#xff0c;也大概介绍了如何安装VMware Tools&#xff0c;因为VMware Tools可以提供对虚…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1&#xff09;爬虫下载原始图片2&#xff09;手动筛选图片 2. 数据处理3. 模型训练及保存4. 模型测试1&#xff09;前端2&#xff09;后端 系统测试1. 测试效果2. 模型应用1&#…

从零开始:PHP实现阿里云直播的简单方法!

1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前&#xff0c;首先需要在阿里云控制台中创建直播应用&#xff0c;然后获取推流地址和播放地址。 推流地址一般格式为&#xff1a; rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…