如何在基于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
相关产品推荐
相关产品推荐

