繁体   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