AIOHTTP的实战(一)
aiohttp是基于asyncio和Python的异步HTTP客户端以及服务器,在这里主要介绍aiohttp在客户端应用请求中的案例应用和案例实战。在使用前需要安装该第三方的库,安装的命令为:
pip3 install aiohttp
安装成功后可以直接使用。在Python的异步编程模式中,特别是想使用,最好保持Python版本是在Python3.5以上的版本,这是因为asyncio是在Python3.4的版本中开始引入。
我们使用aiohttp发送一个简单的网络请求,如请求http://httpbin.org/get,获取到它的响应数据,那么首先需要定义协程函数,在函数中,在函数名前加关键字async,这样的函数我们称为协程函数。先来看一个案例,源码如下:
#!/usr/bin/env python
#!coding:utf-8
import asyncio
import aiohttp
async def getPage():
async with aiohttp.ClientSession() as session:
async with session.get(url='http://httpbin.org/get') as r:
print(r.status)
print(await r.text())
if __name__ == '__main__':
loop=asyncio.get_event_loop()
loop.run_until_complete(getPage())
代码
loop=asyncio.get_event_loop()
loop.run_until_complete(getPage())
是创建事件循环,然后把任务添加到事件循环中进行执行,当然在异步中,与同步到区别是同步只能是等待一个任务执行结束后,再执行另外一个任务,而在异步到,遇到IO的堵塞立刻就会切换到其他的任务。相对而言,在微服务架构中它的通信模式也是基于同步通信和异步通信,而同步通信最大的缺陷是可能导致任务堵塞,如请求前面的任务请求超时,导致后面的任务会堵塞中,而异步的通信会立刻MQ来进行管理,客户端以及服务端也不会知道对方的存在,客户端和服务端只需要关注自己的MQ消息即可。这方面的知识体系在《Python接口自动化测试实战》课程体系里面有讲到,这里不再详细的扩散。刚才说到事件循环,那么也就意味着如果有批量的任务,那么批量的任务可以放到事件循环中然后进行执行,见如下案例源码:
#!/usr/bin/env python
#!coding:utf-8
import asyncio
import aiohttp
import time
async def get_httpbin():
async with aiohttp.ClientSession() as session:
async with session.get(url='http://httpbin.org/get') as r:
print(r.status)
print(await r.text())
async def get_taobao():
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl_context=False)) as session:
async with session.get(url='https://www.taobao.com/') as r:
print(r.status)
if __name__ == '__main__':
task_list=[
get_httpbin(),
get_taobao()
]
asyncio.run(asyncio.wait(task_list))
下面演示aiohttp在post请求的应用,其实aiohttp发送post请求和requests发送post请求在参数上都是一样的,唯一的区别就是aiohttp是基于异步的,还是以一个登录的案例作为案例来演示aiohttp在发送post请求中的应用,源码如下:
#!/usr/bin/env python
#!coding:utf-8
import asyncio
import aiohttp
async def login():
'''发送post的请求方法'''
async with aiohttp.ClientSession() as session:
async with session.post(
url='http://127.0.0.1:8000/auth/login',
json={"username":"134*****195","password":"asd888"},
headers={'Content-Type':'application/json;charset=UTF-8'}) as r:
print(r.status)
print(await r.json())
if __name__ == '__main__':
asyncio.run(login())
执行代码成功后就会显示登录成功后的响应结果信息。
后续会持续介绍AIOHTTP的案例实战应用和服务端稳定性测试的知识体系。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则CPL.2:如果你必须使用C,使用C和C++的共同子集,并且使用C++编译器编译C代码
- C++核心准则SF.1:如果你的项目没有正在遵从的其他习惯,为代码文件使用.cpp后缀,为接口文件使用.h后缀
- 群晖NAS搭建测速网站,支持万兆
- 二叉树:你真的会翻转二叉树么?
- C++核心准则SF.2:.h文件一定不能包含对象定义或者非inline函数定义
- Vue.js 源码⽬录设计
- 本周小结!(二叉树)
- extern "c"(2)
- Mysql 触发器基础
- C++核心准则SF.3:使用.h文件管理所有在多个源文件中使用的声明
- 秋招面经一(蚂蚁、招银)
- php基础之Trait
- 秋招面经五(字节、拼多多、美团、网易)
- 二叉树:我对称么?
- 秋招面经四(亿联,一点资讯,滴滴,用友,猿辅导)