[Python] How to run a Background Task when using websockets in FastAPI/Starlette?

Discussão em 'Python' iniciado por Stack, Maio 17, 2025.

  1. Stack

    Stack Membro Participativo

    My ultimate goal is to write code that only triggers other servers when calling an endpoint and waits for data from a specific channel in Redis to come in. I don't want to know external server's business logic is done due to latency.

    The call_external_server background task function below will notify the external server to send data to Redis (pub/sub). However, it doesn't execute.

    Here is my code:

    async def call_external_server(channel, text):
    print("call_external_server start")
    async with aiohttp.ClientSession() as session:
    async with session.get(f"http://localhost:9000/pub?channel={channel}&text={text}") as resp:
    print(resp)
    print("call_external_server finished")
    return {"response": "external_server is done"}


    @app.websocket("/ws")
    async def websocket_endpoint(channel: str, websocket: WebSocket, background_task: BackgroundTasks):
    await websocket.accept()
    client_info = dict(websocket.headers)
    text = client_info.get("text")
    redis_reader: redis.client.PubSub = await get_redis_pubsub()
    await redis_reader.subscribe(channel)


    # Problem is Here
    background_task.add_task(call_external_server, channel, text)
    # Background task Doesn't work properly

    try:
    while True:
    message = await redis_reader.get_message(ignore_subscribe_messages=True)
    if message is not None:
    decoded_msg = message["data"].decode()
    if decoded_msg == STOPWORD:
    print("(Reader) STOP")
    break
    await websocket.send_text(decoded_msg)
    except Exception as e:
    print(e)
    await websocket.close()
    return
    await websocket.close()
    return

    Continue reading...

Compartilhe esta Página