
404 Assets Not Found Error with OAuth2 Gradio on Localhost
快速结论:使用 gr.mount_gradio_app 搭配 OAuth2 时,某些静态资源端点(如 /assets/、/gradio_api/)返回 404,原因是这些端点未正确使用 path 参数(如期望 /gradio/assets/ 而非 /assets/)。此问题在 Gradio 5 主分支已被修复。
问题场景
当用户通过 FastAPI + Starlette OAuth2(例如 Azure AD)将 Gradio 应用挂载到自定义路径(如 /gradio、/login-demo)时,浏览器请求 localhost:8000/assets/ 或 /gradio_api/ 等端点,但服务器返回 404。该问题在官方 OAuth2 示例(gradio/oauth-example)中也可复现。
报错原文
404 Not Found
浏览器控制台或网络标签中可看到针对 /assets/*** 或 /gradio_api/*** 的请求返回 404。
原因分析
在 gr.mount_gradio_app(app, demo, path="/gradio") 调用中,有些端点(例如静态资源 assets 和 API 路径 gradio_api)忽略了 path 参数,仍从根路径解析,导致 404。这并非 OAuth2 本身的错误,而是 Gradio 内部路由匹配问题。
环境排查
- Gradio 版本:从
4.32.2到5.23.1均受该问题影响(在5.23.1中仍然可复现)。 - 操作系统:Linux(用户报告环境)。
- Python 包:
gradio,gradio_client,fastapi,uvicorn,authlib,starlette。 - OAuth 提供商:Azure AD,但问题不限于特定 OAuth 实现。
解决步骤
- 确认是否使用最新主分支:此问题在 Gradio 主分支(
main)中已被修复。可考虑从 GitHub 源码安装或等待包含修复的下一个正式版本。 - 临时规避方案:如果无法升级,可尝试将挂载路径设置为根路径(
path="/"),但这可能影响多应用部署结构。 - 检查自定义根路径参数:确保
gr.mount_gradio_app中的root_path与path值一致,例如root_path="/gradio"对应path="/gradio"。但根据 Issue 反馈,即使一致,问题仍可能发生。 - 尝试使用官方示例作为基线:对比官方
https://huggingface.co/spaces/gradio/oauth-example的部署方式,确认问题在空项目上也可复现,以排除自建代码的影响。 - 启用详细日志:启动
uvicorn时添加--log-level debug,查看请求路径与实际路由匹配情况。
验证方法
在浏览器中打开挂载后的 Gradio 应用(如 http://localhost:8000/gradio),使用开发者工具的“网络”标签页检查页面加载时是否有 /assets/ 或 /gradio_api/ 相关请求返回 404。若 404 消失,或静态资源正常加载,即表示问题已解决。若使用主分支后问题仍然存在,建议重新打开 Issue。



