日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2024/1/23 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go vs python 对接外部web api_python--web--让python提供api服务--aiohttp-Go语言中文社区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

aiohttp介紹

官網上有這樣一句話介紹:Async HTTP client/server for asyncio and Python

翻譯過來就是 基于asyncio和Python實現(xiàn)的異步HTTP客戶端/服務器

asyncio可以實現(xiàn)單線程并發(fā)IO操作。也就是做異步操作。

如果僅用在客戶端,發(fā)揮的威力不大。如果把asyncio用在服務器端,例如Web服務器,由于HTTP連接就是IO操作,因此可以用單線程+coroutine實現(xiàn)多用戶的高并發(fā)支持。

asyncio實現(xiàn)了TCP、UDP、SSL等協(xié)議,aiohttp則是基于asyncio實現(xiàn)的HTTP框架。

aiohttp的定位和使用場景

以前java要做一個web服務或者api服務 都需要使用springMVC 或者 Struts等框架,現(xiàn)在java有了比較輕量級的Springboot框架,可以很快構建一個可以提供api的web服務。

python以前想提供api或者web服務,也是需要使用Django或者Flask等框架。不過這些框架都比較重,

aiohttp很輕量,可以對標java中的Springboot。

只需要簡單的幾行代碼,就能把你當前的項目轉換成一個 具有api功能的web項目。

主要特點

支持客戶端和HTTP服務器。

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

Web服務器具有中間件,信號和可插拔路由。

參考資料

Python-aiohttp百萬并發(fā)測試和使用經驗

經驗:任何時候,你在等待什么的時候,記得使用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)

新建服務文件(具體業(yè)務的文件)

service.py

from aiohttp import web

# 獲取 module 詳情

async def test(request):

#put或者post方式參數(shù)獲取

#data = await request.json()

#name = data["name"]

#print('請求的信息data為: %s' % str(data))

# /api/{name}/test路徑中的值獲取方式

name = request.match_info['name']

#/api/test?name=joe 參數(shù)獲取方式

#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语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。