部署在Heroku的Python Streamlit应用如何无需Flask获取客户端IP
可行方案:无需引入Flask,直接调用Streamlit内置接口获取请求头即可
- 你之前找不到对应环境变量是因为
HTTP_X_FORWARDED_FOR不是全局环境变量,是每个HTTP请求独立携带的请求头字段,需要从当前用户的请求上下文里读取 - Streamlit 1.8及以上版本已经内置了获取当前会话请求头的接口,不需要额外安装第三方依赖
实现代码
import streamlit as st from streamlit.web.server.websocket_headers import _get_websocket_headers def get_client_ip(): headers = _get_websocket_headers() # Heroku 会自动注入X-Forwarded-For头,格式为「客户端真实IP, 代理1IP, 代理2IP...」 x_forwarded_for = headers.get("X-Forwarded-For") if x_forwarded_for: # 取第一个IP就是客户端真实IP client_ip = x_forwarded_for.split(",")[0].strip() return client_ip # 本地调试时没有代理头,取默认值即可 return "127.0.0.1" # 调用示例 client_ip = get_client_ip() st.write(f"当前访问客户端IP:{client_ip}")
注意事项
- 该方法同时兼容Heroku和Streamlit Share两个部署平台,两个平台的反向代理都会自动注入
X-Forwarded-For请求头 - 如果使用的Streamlit版本低于1.8,可以替换导入语句为
from streamlit.server.server import Server,再通过Server实例获取上下文,优先建议直接升级Streamlit到最新稳定版获得更好的兼容性
内容的提问来源于stack exchange,提问作者FCastell
相关产品推荐
相关产品推荐

