python--web--让python提供api服务--aiohttp

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服务器具有中间件,信号和可插拔路由。

参考资料

官网

快速搭建一个web服务端

github

pypi中的aiohttp包信息

Python-aiohttp百万并发测试和使用经验
经验:任何时候,你在等待什么的时候,记得使用await。

How to create REST API using aiohttp

在原项目基础上集成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
需要对应替换成自己的域名和需要的路径

发布了805 篇原创文章 · 获赞 897 · 访问量 524万+

猜你喜欢

转载自blog.csdn.net/q383965374/article/details/100745098