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

部署在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:18:03