跳到主要内容

如何处理 Spaces 中的 URL 参数

你可以把 URL 查询参数(query parameters)当作一种数据共享机制。例如,你可以通过 URL 直接“深链接”到某个具有特定状态的应用页面。

在 Space 页面(https://huggingface.co/spaces/<user>/<app>)上,真正运行应用的页面是 https://*.hf.space/,它被嵌入在一个 iframe 中。在初次加载时,父页面 URL 上的查询字符串(query string)和 hash 会自动传递给 iframe 中的应用,因此嵌入的应用在加载时就可以直接读取这些值,无需额外处理。

相比之下,从嵌入的应用内部去更新父页面 URL 的查询字符串和 hash,要稍微复杂一些。 如果你希望在 Docker 或 static Space 中做到这一点,需要加入下面这段 JS 代码,向父页面发送一条包含 queryString 和/或 hash 字段的消息:

const queryString = "...";
const hash = "...";

window.parent.postMessage({
queryString,
hash,
}, "https://huggingface.co");

上述方式仅适用于 Docker 或 static Spaces。

对于 Streamlit 应用,Spaces 会自动同步 URL 参数。Gradio 应用可以从 Spaces 父页面读取查询参数,但不会把更新后的 URL 参数再同步回父页面。

需要注意的是:父页面的 URL 参数只会在首次加载时被传递到嵌入应用中。也就是说,即使父页面的 hash 通过上述方式被更新,嵌入应用中的 location.hash 也不会随之变化。

你可以在下面这个 static Space 中看到这种做法的完整示例:
whitphx/static-url-param-sync-example.