如何在Streamlit应用中获取来源URL?
在Streamlit中获取请求来源URL(Referrer)的方法
因为Streamlit没有直接暴露类似Flask request.referrer的API,你可以通过以下两种变通方案实现需求:
方案1:通过前端自定义组件读取document.referrer
浏览器的document.referrer属性会记录当前页面的跳转来源,我们可以写一个极简的自定义组件来读取该值并传回Streamlit后端。
组件代码(保存为referrer_component.py)
import streamlit as st import streamlit.components.v1 as components def get_referrer(): # 前端JS读取referrer并发送给Streamlit js_code = """ <script> const referrer = document.referrer; window.parent.postMessage({ type: 'streamlit:setComponentValue', value: referrer }, '*'); </script> """ return components.html(js_code, height=0)
主应用调用
import streamlit as st from referrer_component import get_referrer st.title("获取跳转来源URL示例") referrer = get_referrer() if referrer: st.success(f"请求来源:{referrer}") else: st.info("无跳转来源(直接访问页面)")
方案2:利用Streamlit底层Flask添加中间件捕获请求头
Streamlit基于Flask运行,我们可以通过修改Flask实例的中间件,在请求到达时捕获request.referrer并存入会话状态。
示例代码
import streamlit as st from flask import request from streamlit.web.server.server import Server def get_flask_app(): # 获取Streamlit底层的Flask应用实例 server = Server.get_current() return server._app if server else None # 添加Flask前置请求中间件 flask_app = get_flask_app() if flask_app: @flask_app.before_request def capture_referrer(): if 'referrer' not in st.session_state: st.session_state['referrer'] = request.referrer st.title("通过Flask中间件获取Referrer") if 'referrer' in st.session_state: referrer = st.session_state['referrer'] st.success(f"请求来源:{referrer}" if referrer else "无跳转来源(直接访问页面)") else: st.info("请刷新页面完成初始化")
注意事项
- 方案1兼容性更强,不依赖Streamlit底层实现,但需要用户浏览器启用JavaScript;
- 方案2直接从HTTP请求头获取数据更可靠,但依赖Streamlit的Flask底层架构,未来版本可能存在兼容性风险;
- 无论哪种方案,
referrer都可能为空(比如用户直接输入URL访问、跨协议跳转、浏览器隐私设置阻止发送等场景)。
内容的提问来源于stack exchange,提问作者Jefferson Camillo
相关产品推荐
相关产品推荐

