aiohttp介绍

官网上有这样一句话介绍:Async HTTP client/server for asyncio and Python

翻译过来就是 基于asyncio和Python实现的异步HTTP客户端/服务器

asyncio可以实现单线程并发IO操作。也就是做异步操作。

如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。

asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。

aiohttp的定位和使用场景

以前java要做一个web服务或者api服务 都需要使用springMVC 或者 Struts等框架,现在java有了比较轻量级的Springboot框架,可以很快构建一个可以提供api的web服务。

python以前想提供api或者web服务,也是需要使用Django或者Flask等框架。不过这些框架都比较重,

aiohttp很轻量,可以对标java中的Springboot。

只需要简单的几行代码,就能把你当前的项目转换成一个 具有api功能的web项目。

主要特点

支持客户端和HTTP服务器。

无需使用Callback Hell即可支持Server WebSockets和Client WebSockets。

Web服务器具有中间件,信号和可插拔路由。

参考资料

Python-aiohttp百万并发测试和使用经验

经验:任何时候,你在等待什么的时候,记得使用await。

在原项目基础上集成aiohhtp-让python项目提供api服务

如果我们已经有了一个项目,想让它具备提供api服务的能力,步骤如下:

引入aiohttp包

在requirements文件或者pyproject.toml文件中添加

aiohttp = "^3.5"

新建路由文件

routes.py

import api_module.service as service

def setup_routes(app):

# 测试

app.router.add_get('/api/{name}/test', service.test)

#app.router.add_post('/api/{name}/test', service.test)

#app.router.add_put('/api/{name}/test', service.test)

新建服务文件(具体业务的文件)

service.py

from aiohttp import web

# 获取 module 详情

async def test(request):

#put或者post方式参数获取

#data = await request.json()

#name = data["name"]

#print('请求的信息data为: %s' % str(data))

# /api/{name}/test路径中的值获取方式

name = request.match_info['name']

#/api/test?name=joe 参数获取方式

#query = request.query

#name = query.get("name")

print(name)

try:

return web.json_response({'code': 0, 'data': name})

except Exception as e:

return web.json_response({'msg': e.value}, status=500)

main文件中增加启动web命令

main.py

from aiohttp import web

from api_module.routes import setup_routes

async def start_init_test(app):

print("初始化操作")

async def end_init_test(app):

print("清理操作")

def main():

app = web.Application()

setup_routes(app)

app.on_startup.append(start_init_test)

app.on_cleanup.append(end_init_test)

web.run_app(app)

if __name__ == "__main__":

main()

启动web方式

启动main文件即可

使用命令

python3.7 main.py

如果是 poetry项目 pyproject.toml文件中使用

[tool.poetry.scripts]

start = '项目名.main:main'

例如

[tool.poetry.scripts]

start = 'api_module.main:main'

启动使用命令

start

启动完成后输出如下:

初始化操作

======== Running on http://0.0.0.0:8080 ========

(Press CTRL+C to quit)

浏览器中测试访问

http://127.0.0.1:8080/api/joe/test

返回如下:

{"code": 0, "data": "joe"}

如图:

增加ingress

如果是k8s的项目 需要增加ingress对外公开api

deploy.yml 中增加ingress的信息

apiVersion: v1

kind: Service

metadata:

name: my-api-service

namespace: default

spec:

selector:

app: my-api

ports:

- protocol: TCP

port: 8080

targetPort: 8080

---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: my-api-ingress

namespace: default

annotations:

kubernetes.io/ingress.class: traefik

traefik.frontend.rule.type: PathPrefix

spec:

rules:

-

host: api-beta.test.com

http:

paths:

- path: /api

backend:

serviceName: my-api-service

servicePort: 8080

host: api-beta.test.com

path: /api

需要对应替换成自己的域名和需要的路径

go vs python 对接外部web api_python--web--让python提供api服务--aiohttp-Go语言中文社区相关推荐

  1. 简笔彩色圣诞树的python代码_Python绘图,圣诞树,花,爱心 | Turtle篇-Go语言中文社区...

    1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle. ...

  2. python爬微信好友_用Python爬了自己的微信好友,原来他们是这样的人……-Go语言中文社区...

    导读: 用了微信几年了,微信号有也不少了,但是真正了解自己的好友吗?好友最多的城市是哪个?好友男女比例是多少?好友签名都是什么?今天我们来充分了解自己的微信好友. 01 准备工作 运行平台:Windo ...

  3. python爬图片_Python爬虫:彼岸图网图片爬取-Go语言中文社区

    杂 哈哈,这是我第一篇博客 半年以后回来再看发现这代码简直太难看了 现在已经弃用大小驼峰转蛇形命名了 确实好看 除了命名别的也写的不怎么样 因为爬虫只是个爱好所以也不准备再投入时间重构了 将就着看吧 ...

  4. 使用python函数计算3.5四舍五入的结果_python 数字的四舍五入-Go语言中文社区

    python 数字的四舍五入 问题 你想对浮点数执行指定精度的舍入运算. 解决方案 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可.比如: 当一个值刚好在两个边界 ...

  5. python方差函数_python 中的var()函数和cov函数用法-Go语言中文社区

    本文是学习多篇博客总结而得: numpy中var和cov函数求法和MATLAB中var和cov函数求法类似: 首先均值X,样本方差S,样本协方差C 公式分别为: 一.  MATLAB和Python中计 ...

  6. python海龟怎样写字又快又好看_用python的小海龟 Turtle 画一朵好看又有趣的小花-Go语言中文社区...

    1967年, Daniel G. Bobrow , Wally Feurzeig , Seymour Papert 和 Cynthia Solomon 设计了LOGO编程语言,用一种直观的方式教孩子们 ...

  7. 用python画小花_用python的小海龟 Turtle 画一朵好看又有趣的小花-Go语言中文社区...

    1967年, Daniel G. Bobrow , Wally Feurzeig , Seymour Papert 和 Cynthia Solomon 设计了LOGO编程语言,用一种直观的方式教孩子们 ...

  8. python爬取王者_python爬取王者荣耀APP英雄皮肤-Go语言中文社区

    我们用fillder抓包下载,>>fillder软件下载 1.下载安装软件,设置Tools >> HTTPS里面全部勾选 2.options >> connecti ...

  9. python导入外部文件-如何导入其他Python文件?

    导入python文件的方法很多,都有各自的优缺点. 不要仓促地选择对您有用的第一个导入策略,否则,当您发现代码基不能满足您的需要时,您将不得不重写代码基. 我将首先解释最简单的示例#1,然后我将转向最 ...

最新文章

  1. html col居中无效,html中col标签中的汉字如何居中?html col标签的基本使用(内有实例)...
  2. 酒店用机器学习,预测哪些客人会放鸽子
  3. rⅰd的意思_计量经济学练习题
  4. 移动H5开发入门知识,CSS的单位汇总与用法
  5. 【Qt】QBoxLayout类详解
  6. 秒杀多线程第八篇 经典线程同步 信号量Semaphore
  7. 使用verilog设计实现QR分解
  8. 解决eclipse 文件更新不自动刷新的问题
  9. 2021年Node.js开发人员学习路线图
  10. 大数据“重磅炸弹”:实时计算框架 Flink
  11. convolutional pose machines
  12. 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 1353期】
  13. 电源大师课笔记 2.5
  14. 如何在金蝶服务器增加用户,详解金蝶KIS记账王如何新增用户
  15. GB2312-80 所有汉字排序-拼音
  16. 英雄联盟游戏语音无法连接服务器,英雄联盟语音连不上是电脑哪里出问题了
  17. python爬虫入门之爬取英雄联盟官网的所有英雄数据
  18. 【风马一族_php】常用的语句
  19. 生产环境CPU占用飙高问题解决
  20. matlab各次谐波含量,与谐波相关的基本概念

热门文章

  1. 移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID的名词解释
  2. R语言GGPlot2
  3. Matlab获取新浪财经实时行情
  4. swift源代码兼容开源项目清单
  5. redis实现简单限流
  6. java基础---Calendar类
  7. java小编程----三数之和
  8. IDEA怎么从数据库表自动生成映射Model
  9. 【数据结构】B树的理解
  10. C# 实验三 判断一个字符、判断三角形、千名学生、a+aa+aaa+aaaa、求数列相加、约瑟夫环