簡體   English   中英

如何使用 FastAPI 實時發布數據?

[英]How can I POST data in real time using FastAPI?

我使用 FastAPI 構建了一個簡單的演示項目。 我想實時將數據發布到服務器(可能是30fps )。

 # in client while True:.... res = requests.post(URL, files={'input_data': input_data})....

但是,我收到以下錯誤:

(MaxRetryError: HTTPConnectionPool(host='~~', port=8000): url 超出最大重試次數)

我認為這是由於多個請求引起的,但我想實時執行請求。 我能怎么做?

正如@MatsLindh 在評論中指出的那樣,對於這樣的任務,您應該使用更合適的協議(例如WebSockets )而不是HTTP FastAPI/Starlette 支持在websocket上發送和接收數據(請參閱此處此處的文檔)。 下面是一個使用websockets將視頻幀從客戶端發送到服務器的示例(假設這是您對30fps的評論中的任務 - 但是,相同的方法可以應用於發送其他類型的數據)。 OpenCV用於捕獲幀, websockets庫用於連接到 WebSocket 服務器。

服務器.py

 from fastapi import FastAPI, WebSocket, WebSocketDisconnect import cv2 import numpy as np app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): # listen for connections await websocket.accept() #count = 1 try: while True: contents = await websocket.receive_bytes() arr = np.frombuffer(contents, np.uint8) frame = cv2.imdecode(arr, cv2.IMREAD_UNCHANGED) cv2.imshow('frame', frame) cv2.waitKey(1) #cv2.imwrite("frame%d.png" % count, frame) #count += 1 except WebSocketDisconnect: cv2.destroyWindow("frame") print("Client disconnected")

客戶端.py

 import websockets import asyncio import cv2 camera = cv2.VideoCapture(0, cv2.CAP_DSHOW) async def main(): # Connect to the server async with websockets.connect('ws://localhost:8000/ws') as ws: while True: success, frame = camera.read() if not success: break else: ret, buffer = cv2.imencode('.png', frame) await ws.send(buffer.tobytes()) # Start the connection asyncio.run(main())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM