FastAPI中使用StreamingResponse实现SSE时无法设置Cookie的问题咨询
我正在开发一个FastAPI应用,需要在使用Server-Sent Events(SSE)向客户端流式传输数据的同时设置HTTP Cookie。但我遇到了一个问题:在返回StreamingResponse的路由里使用response.set_cookie时,客户端浏览器并没有成功设置Cookie。
以下是我的代码:
from fastapi import FastAPI, Response, Request from starlette.responses import StreamingResponse app = FastAPI() @app.get("/stream") async def stream(response: Response, request: Request): # 处理会话管理的示例函数 user_chat_session = handle_session(request, response, redis_client) # 尝试设置Cookie response.set_cookie( key="chat_session", value="test", httponly=True, expires=3600, # 1小时过期 ) # 返回SSE的流式响应 return StreamingResponse( chat_client.stream(question="hello", user_chat_session=user_chat_session), media_type="text/event-stream" )
问题所在
chat_session这个Cookie并没有在客户端成功设置。我知道response.set_cookie是通过修改HTTP头来实现的,怀疑这个问题和StreamingResponse的工作机制有关。
因为SSE采用流式连接,响应头会被立即发送,一旦头信息发送完成,就无法再对其进行修改了——这可能就是set_cookie不生效的原因。
关键细节
如果我去掉StreamingResponse,转而返回一个普通响应(比如return {"message": "test"}),Cookie就能正常设置。这让我确信问题确实和SSE场景下的StreamingResponse处理响应头的方式有关。
我的疑问
- 是否可以在返回
StreamingResponse的同时设置Cookie? - 如果不行,最佳的替代方案是什么?
任何关于在SSE中处理Cookie的见解、建议或最佳实践我都非常感激!
我已经尝试过的方法
- 在返回
StreamingResponse之前调用response.set_cookie。 - 确认了返回常规JSON响应时Cookie能正常设置(所以问题只出在使用
StreamingResponse的时候)。
备注:内容来源于stack exchange,提问作者B A.J Amar




