怎样在Python Flask中获取Header请求头信息_使用request.headers

2026-05-24日常编程192014

在Flask中应使用request.headers.get("Header-Name")安全读取请求头,该对象大小写不敏感、类字典,键不存在时返回None;自定义头需确保代理(如Nginx)透传,调试时可用dict(request.headers)打印全部头信息。

如何在Flask中正确读取 request.headers

request.headers 是一个类字典对象(Headers 类型),支持大小写不敏感的键访问,但不能直接用点号访问(比如 request.headers.User-Agent 会报错)。它底层是 werkzeug.datastructures.Headers,行为接近 dict,但更严格。

  • 使用 request.headers.get("X-Forwarded-For")request.headers["X-Forwarded-For"] 都可以,前者返回 None(安全),后者键不存在时抛 KeyError
  • 所有 header 名会被自动标准化为首字母大写的格式(如 user-agentUser-Agent),所以传参时用任意大小写都行,但推荐用标准格式提高可读性
  • 如果前端发的是自定义 header(如 X-Request-ID),确保它没被反向代理(如 Nginx)过滤掉——默认会丢弃带下划线的 header

常见 Header 读取错误和绕过方式

实际开发中常遇到 header 看似存在却读不到,多数不是 Flask 问题,而是环境或客户端导致:

  • request.headers.get("Authorization") 在浏览器直接访问时为空:因为浏览器只在跨域预检(CORS)通过且响应头含 Access-Control-Allow-Headers: Authorization 后,才真正发送该 header
  • request.headers.get("Cookie") 返回空字符串而非 None:这是正常行为,表示 header 存在但值为空;需用 if request.headers.get("Cookie") 判断,而不是 if "Cookie" in request.headers(后者为真,即使值为空)
  • Nginx 默认过滤掉 X-Real-IPX-Forwarded-For 等 header:需在配置里显式透传,例如添加 proxy_set_header X-Forwarded-For $remote_addr;

request.headersrequest.environ 的关系

Flask 的 request.headers 实际是从 WSGI environ 中提取出来的,原始 raw header 都存在 request.environ 里,键名以 HTTP_ 开头并转为大写+下划线(如 User-AgentHTTP_USER_AGENT):

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

  • request.headers.get("User-Agent")request.environ.get("HTTP_USER_AGENT") 值相同
  • request.environ 还包含非 HTTP header 字段(如 REQUEST_METHODPATH_INFO),不要混用
  • 某些部署环境(如某些容器或 serverless 平台)可能未规范设置 environ,此时优先信任 request.headers,它是 Flask 封装后的稳定接口

调试 header 的实用技巧

上线前快速确认 header 是否到达 Flask 层,最简单的方法是打印全部:

from flask import request

@app.route("/debug") def debug_headers(): return { "headers": dict(request.headers), # 转成普通 dict 方便查看 "environkeys": [k for k in request.environ.keys() if k.startswith("HTTP")] }

  • 不要用 print(request.headers),输出不可读(它重写了 repr 但不友好)
  • 浏览器开发者工具 Network 标签页看到的 Request Headers 是「发出的」,而 request.headers 是「收到的」,两者不一致说明中间有代理或网关做了修改
  • 如果某个 header 始终缺失,先 curl 测试绕过浏览器:curl -H "X-Test: 123" https://www.ufcn.cn/link/36a1c366bf2be376685c6ae023e666fd,排除前端 JS 或 CORS 干扰

Flask 对 header 的封装很轻量,问题通常不出在读取逻辑本身,而在于请求链路中的某一层(前端、CDN、反向代理、WAF)悄悄改写或丢弃了字段。盯住 request.headers.get() 的返回值,再比对 curl 和浏览器行为,基本能定位到哪一环掉了链子。

本文地址:https://www.ufcn.cn/tutorials/3427828.html

如非特殊说明,本站内容均来自于网友自主分享,概不代表本站观点,如有任何问题我们都将在收到反馈后的第一时间进行处理!