You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask中获取所有Set-Cookie响应头?

解决Flask代理中丢失多Set-Cookie头的问题

问题本质

你遇到的核心问题是:Flask底层的Werkzeug库在处理响应头时,默认会将同名响应头合并为单个值,但Set-Cookie是HTTP规范中的特殊头——RFC明确允许返回多个独立的Set-Cookie头(每个Cookie对应一个),不能用逗号合并(合并后浏览器无法正确解析)。而你之前的处理方式要么是直接赋值覆盖了头,要么是从Werkzeug处理后的Headers对象中取值,只能拿到第一个值。

具体解决步骤

假设你用requests库作为上游请求工具(其他库思路类似),按以下方式修改代理逻辑:

  1. 从上游响应中完整获取所有Set-Cookie头
    请求路由器后,直接从上游响应的headers中提取所有Set-Cookie项,不要用普通的get方法,要用对应库的多值提取方法:

    # 用requests请求路由器登录接口
    router_resp = requests.post(
        "http://你的路由器IP/登录路径",
        data=request.form,
        allow_redirects=False  # 避免requests自动处理跳转丢失Cookie
    )
    # 获取所有Set-Cookie头,requests用getlist方法
    all_set_cookies = router_resp.headers.getlist('Set-Cookie')
    
  2. 构造Flask响应时逐个添加Set-Cookie头
    不要直接将上游headers赋值给Flask Response的headers(会触发Werkzeug的合并逻辑),而是单独逐个添加每个Set-Cookie,再复制其他非Set-Cookie的头:

    from flask import Response, request
    
    # 构造基础响应
    flask_resp = Response(
        router_resp.content,
        status=router_resp.status_code,
        content_type=router_resp.headers.get('Content-Type')
    )
    
    # 逐个添加所有Set-Cookie头,用add方法而非直接赋值
    for cookie_header in all_set_cookies:
        flask_resp.headers.add('Set-Cookie', cookie_header)
    
    # 复制其他响应头(跳过已处理的Set-Cookie)
    for header_name, header_value in router_resp.headers.items():
        if header_name.lower() != 'set-cookie' and header_name not in flask_resp.headers:
            flask_resp.headers[header_name] = header_value
    
    return flask_resp
    

为什么之前的方法取不到所有Set-Cookie?

  • 如果你用Flask.Response.headers.get_all('Set-Cookie'),是因为Werkzeug已经将多个Set-Cookie合并成了一个逗号分隔的字符串(不符合规范),或者你在构造响应时用了flask_resp.headers['Set-Cookie'] = xxx的赋值方式,直接覆盖了之前的Set-Cookie头,只保留了最后一个(或第一个)。
  • 浏览器能看到原始的多个Set-Cookie,是因为路由器返回的原始HTTP响应确实包含多个头,但你的代理逻辑没有完整传递这些头。

内容的提问来源于stack exchange,提问作者Alex Bowes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:45:08