一文学会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.mzph.cn/news/182819.shtml

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

相关文章

【Vulnhub 靶场】【Coffee Addicts: 1】【简单-中等】【20210520】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/coffee-addicts-1,699/ 靶场下载:https://download.vulnhub.com/coffeeaddicts/coffeeaddicts.ova 靶场难度:简单 - 中等 发布日期:2021年5月20日 文件大小:1.3 …

【数值计算方法(黄明游)】常微分方程初值问题的数值积分法:欧拉方法(向后Euler)【理论到程序】

文章目录 一、数值积分法1. 一般步骤2. 数值方法 二、欧拉方法(Euler Method)1. 向前欧拉法(前向欧拉法)2. 向后欧拉法(后向欧拉法)a. 基本理论b. 算法实现 常微分方程初值问题的数值积分法是一种通过数值方…

webpack如何处理文件、图片

webpack5之前是通过,file-loader、raw-loader、url-loader处理文件 webpack5是通过使用资源模块类型(asset module type)处理文件 资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loade…

Linux常用命令——rm 命令

文章目录 Linux系统中的rm命令是一个非常强大且危险的工具,用于删除文件和目录。由于其具有不可逆的特性,了解其参数和正确使用非常重要。 1. 基本用法 rm命令的基本格式是rm [选项] 文件或目录。不带任何选项时,rm命令仅删除文件。 示例&a…

python读取excel自动化生成sql建表语句和java实体类字段

1、首先准备一个excel文件: idtypenameidint学号namestring姓名ageint年龄sexstring性别weightdecimal(20,4)体重scoredecimal(20,4)分数 2、直接生成java字段和注释: import pandas as pddf pd.read_excel(test.xlsx, sheet_nameSheet1)for i in ran…

java 对象大小计算

说明: 对于64位机:一个对象由三部分组成 对象头(object header) mark word :64bitkclass pointer :32bit(默认使用指针压缩),如果取消指针压缩( XX:-UseCompressedOops),则占用64bit数组长度:数…

Zynq-Linux移植学习笔记之67- 国产ZYNQ上通过GPIO模拟MDC/MDIO协议

1、背景介绍 模块上有9个PHY,其中两个PHY通过ZYNQ PS端的MDIO总线连接,其余7个PHY单独通过GPIO进行控制,需要实现GPIO模拟MDC/MDIO协议。 2、vivado工程设计 vivado工程内为每个PHY建立两个GPIO IP核,分别用来代表MDC和MDIO&…

基于BP神经网络的手写体数字识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 filename dir(images\*.bmp); %图像文件格式 load BP.matfilename dir(test\*.bmp); …

PyQt基础_009_ 按钮类控件QSlider

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class SliderDemo(QWidget):def __init__(self, parentNone):super(SliderDemo, self).__init__(parent)self.setWindowTitle("QSlider 例子") self.resize…

Google play开发者账号付款资料暂停的原因及解决方案

相信大多数Google play开发者都收到过这封邮件 邮件内容的大致意思是“由于可疑的活动,我们暂停了你的付款资料。” “要恢复您的帐户,请转到您的帐户并执行所要求的操作。” 这是触发了谷歌的付款风控机制,根据开发者们的反馈,账…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券,文末可领取 。 事情发生于 2023年11月27日晚~28日中午,滴滴打车服务出现大面积故障,登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题,导致大量用户滞留在外,出行受阻…

2023年11月编程语言排行榜——你的编程语言上榜了吗?

编程语言的流行度是一个热门的话题,不同的机构和平台有不同的评判标准和排名方法。本文将以 TIOBE 编程社区指数为例,介绍 2023 年 11 月的编程语言趋势榜单,分析各种编程语言的表现和原因,以及对未来的展望。 TIOBE 编程社区指数…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课: 【小黑嵌入式系统第一课】嵌入式系统的概述(一)——概念、特点、发展、应用 下一课: 【小黑嵌入式系统第三课】嵌入式系统硬件平台(一)——概述、总线、存储设备(RAM&ROM&FLASH…

QDoubleSpinBox的使用示例

QDoubleSpinBox即可以做为数值型输入框使用,也可以使用只读型数据显示框,在作为输入框使用时比QLineEdit有以下几个方面的优势 1.可以设置范围,并且范围精确, 2.输入数据精确,自动屏幕非数值以外的字符。 3.设置步长后…

文件基础知识

计算机中的流:在C语言中将通过输入/输出设备(键盘、内存、显示器、网络等)之间的数据传输抽象表述为“流”。 1、文本流和二进制流 在文本流中输入输出的数据是一系列的字符,可以被修改在二进制流中输入输出数据是一系列字节&am…

RabbitMQ消息模型之Sample

Hello World Hello World是官网给出的第一个模型,使用的交换机类型是直连direct,也是默认的交换机类型。 在上图的模型中,有以下概念: P:生产者,也就是要发送消息的程序C:消费者:消…

【Linux】gcc和g++

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和Linux还有算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 …

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件,但本地没有这个文件,该怎么办呢?往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理? 两个人在同一个分支上,两个人修改了不同文件 其中一人&…

Python 哈希表的实现——字典

哈喽大家好,我是咸鱼 接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧 虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构 在 Python 中,字典的键(key)被哈希&#x…

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法

如果你是公众人物、企业或拥有个人品牌的人,那么拥有在线形象很重要。然而,你可能会发现,通过谷歌搜索,陌生人可以获得你的个人信息,如联系方式、地址和财务信息,这会让你感到不安。 幸运的是,…