You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FastAPI中使用StreamingResponse实现SSE时无法设置Cookie的问题咨询

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

火山引擎 最新活动