We set up a basic notification system using SSE from our FastAPI server which seems to work fine locally, but doesn't work when we push it to our Azure Web App? I have server logs where I can see the notification is sent and consumed, but we can't see it being recieved on the frontend? I've looked around and seen discussion about turning off response buffering, but can't seem to figure out WHERE to do that (where can I find web.config's equivalent for our proj? We use containers if that helps?).
Here's a brief example of how the route looks:
@router.get(
"/stream-notifs",
response_description="User task notifications",
response_model=Response,
tags=["users"],
)
async def notif_update_stream(request: Request, user_id: str):
# print(request.state.q)
MESSAGE_STREAM_DELAY = 1 # second
MESSAGE_STREAM_RETRY_TIMEOUT = 15000 # milisecond
client_host = request.client.host
print(f"Client {client_host} connected.")
async def event_generator():
notif_q: asyncio.Queue = request.state.notif_q
this_user_notifs = []
while True:
notif_data: NotificationData = await notif_q.get()
if notif_data.creator_id == UUID(user_id):
# TODO: Add validation
this_user_notifs.append(notif_data)
print(f"Sending to: {request.client}")
else:
notif_q.put_nowait(notif_data)
# If client was closed the connection
if await request.is_disconnected():
break
# Checks for new messages and return them to client if any
for curr_notif in this_user_notifs: # Whenever a task is completed
notif = Notification(
id="message_id",
event="completed_task",
retry=MESSAGE_STREAM_RETRY_TIMEOUT,
data=curr_notif,
).model_dump_json()
yield notif
this_user_notifs.pop()
notif_q.task_done()
print(f"Finished notif {notif}")
await asyncio.sleep(MESSAGE_STREAM_DELAY)
await notif_q.join()
return EventSourceResponse(
event_generator(),
media_type="text/event-stream",
headers={
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Transfer-Encoding": "chunked",
"Connection": "keep-alive",
"X-Accel-Buffering": "no",
},
)
The team is pretty new to Azure, so there's probably something I missed here. The backend is hosted on a container on a web app like I mentioned, and the frontend is the same (Vue). Any help/advice would be greatly appreciated!
As mentioned, I tried finding the settings to disable response buffering, looked for web.config, added the X-Accel-Buffering and Cache-Control headers but to no avail.
Any help at all would be greatly appreciated!