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

如何在基于Python的Streamlit网站中获取用户IP地址

获取Streamlit网站访问用户IP的方法

方法1:通过Streamlit运行时上下文读取请求头

Streamlit的运行时上下文可获取当前请求的头信息,从中提取用户IP,需注意部署环境差异:

  • 本地开发环境:直接读取Remote-Addr头
  • 云平台部署(如Streamlit Cloud、Heroku、AWS EC2等):因存在反向代理,需读取X-Forwarded-For头(该字段包含原始用户IP)

示例代码:

import streamlit as st
from streamlit.runtime.scriptrunner import get_script_run_ctx

def get_user_ip():
    ctx = get_script_run_ctx()
    if ctx is None:
        return "无法获取IP"
    
    request = ctx.request
    # 优先读取反向代理传递的原始IP
    ip = request.headers.get("X-Forwarded-For")
    if ip:
        # X-Forwarded-For可能包含多个IP,取第一个
        ip = ip.split(",")[0].strip()
    else:
        # 本地环境直接取Remote-Addr
        ip = request.headers.get("Remote-Addr")
    
    return ip

st.write(f"你的IP地址是:{get_user_ip()}")

方法2:自定义Web服务器挂载Streamlit(进阶)

若需更灵活控制,可使用FastAPI或Flask搭建自定义服务器,将Streamlit作为子应用挂载,直接从Web框架的请求对象中获取IP。

示例(FastAPI):

import streamlit as st
from fastapi import FastAPI, Request
from fastapi.middleware.wsgi import WSGIMiddleware

app = FastAPI()

# 挂载Streamlit应用
st_app = st._main._create_streamlit_handler()
app.mount("/", WSGIMiddleware(st_app))

@app.get("/get-ip")
async def get_ip(request: Request):
    ip = request.headers.get("X-Forwarded-For") or request.client.host
    return {"ip": ip}

# 运行命令:uvicorn main:app --host 0.0.0.0 --port 8501

该方法适合需整合其他Web功能的场景,能更稳定获取用户IP。

注意事项

  • 部分云平台会修改请求头字段,需查看平台文档确认正确的IP传递字段(如Cloudflare使用CF-Connecting-IP)
  • 本地运行时,Remote-Addr可能返回127.0.0.1或::1,属于正常本地回环地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:43:12