I need to pass live data from a python script to my server (made with FastApi) and from this server I need to pass all of them to a client (made with Angular).
Currently I’m doing Http PUT requests from my script and then I’m using Websocket to pass the updates to the client.
The problem is that whenever my server socket is connected, I can’t receive any http requests from my script.
If this solution is not viable, what others might be? And why?
I share my dummy code:
script.py
import requests import time if __name__ == "__main__": while True: headers = {"Content-Type": "application/json"} url = "http://localhost:8000/dummy" requests.put(url, data={"dummy": "OK"}, headers=headers) time.sleep(1)
myserver.py
from queue import Queue from fastapi import FastAPI, WebSocket from starlette.middleware.cors import CORSMiddleware import uvicorn queue = Queue() app = FastAPI() app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], expose_headers=["*"]) @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: msg = queue.get() await websocket.send_json(data=msg) @app.put("/dummy") async def update(dummy): queue.put(dummy) if __name__ == "__main__": uvicorn.run("myserver:app", host='0.0.0.0', port=8000)
Client implementation is irrelevant.
Advertisement
Answer
I used a Socket to transmit data from the script to my server and a WebSocket to transmit data from my server to the client.