异步请求库aiohttp

本文详细介绍了异步请求库aiohttp的使用,包括发起请求、POST、传递参数、响应状态码处理、文件上传、设置超时、管理cookie、自定义请求头、SSL验证及代理设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异步请求库aiohttp的使用

1.使用aiohttp发起一个请求

官方推荐使用一个客户端会话来发起所有请求,会话中记录了请求的cookie,但你还可以使用aiohttp.request来发送请求。

当我们使用 async def 就是定义了一个异步函数,异步逻辑由asyncio提供支持。

async with aiohttp.ClientSession() as session 为异步上下文管理器,在请求结束时或者发生异常请求时支持自动关闭实例化的客户端会话。

import asyncio
import aiohttp


async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://httpbin.org/get') as resp:
            print(resp.status)
            print(await resp.text())


if __name__ == '__main__':
    # python3.7才支持这种写法,作为一个入口函数,以debug模式运行事件循环
    asyncio.run(main(), debug=True)
    # python3.6及以下版本写法
    event_loop = asyncio.get_event_loop()
    results = event_loop.run_until_complete(asyncio.gather(main()))
    event_loop.close()

关于asyncio的一些关键字的说明:

  • event_loop 事件循环:程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数。
  • coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
  • task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含了任务的各种状态。
  • future: 代表将来执行或没有执行的任务的结果。它和task上没有本质上的区别。
  • async/await 关键字:python3.5用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。

2.发送post请求

除了常用的get和post请求还有以下几种请求方式:

  • put: session.put('http://httpbin.org/put', data=b'data')
  • delete: session.delete('http://httpbin.org/delete')
  • head: session.head('http://httpbin.org/get')
  • options: session.options('http://httpbin.org/get')
  • patch: session.patch('http://httpbin.org/patch', data=b'data')
import asyncio
import aiohttp

async def main():
    data = b'\x00Binary-data\x00'  # 未经编码的数据通过bytes数据上传
    data = 'text'  # 传递文本数据
    data = {
   'key': 'value'}  # 传递form表单
    async with aiohttp.ClientSession() as sess:
        async with sess.post('http://httpbin.org/post', data=data) as resp:
            print(resp.status)
            print(await resp.text())


# 复杂的post请求
async def main2():
    pyload = {
   'key': 'value'}  # 传递pyload
    async with aiohttp.ClientSession() as sess:
        async with sess.post('http://httpbin.org/post', json=pyload) as resp:
            print(resp.status)
            print(await resp.text())


if __name__ == '__main__':
    asyncio.run(main<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值