go vs python 对接外部web api_python--web--让python提供api服务--aiohttp-Go语言中文社区
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语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb6 combo根据index显示选项
- 下一篇: python代码直接关机_python实