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

如何在同一服务器端口集成Uvicorn、FastAPI、Streamlit和Starlette?

解决方案:通过ASGI挂载实现FastAPI与Streamlit同端口多路由集成

因为FastAPI(基于Starlette)和Streamlit均为ASGI兼容应用,我们可以利用Starlette的Mount功能,将两个应用分别挂载到指定路由下,最终通过Uvicorn启动统一的主应用。

步骤1:安装依赖

确保已安装所需包:

pip install fastapi uvicorn streamlit

步骤2:编写集成代码

创建main.py文件,实现主应用挂载逻辑:

from fastapi import FastAPI
from starlette.mount import Mount
import streamlit.web.server.server as st_server

# 1. 创建FastAPI API子应用,路由前缀绑定/api/v1
api_app = FastAPI(root_path="/api/v1")

# 添加示例API路由
@api_app.get("/health")
async def health_check():
    return {"status": "ok", "service": "FastAPI API"}

# 2. 配置并获取Streamlit的ASGI应用
# 设置Streamlit的基础路径为/app,确保内部资源路径正确
st_config = st_server.get_config_options()
st_config["server.baseUrlPath"] = "/app"
st_config["server.enableCORS"] = False  # 根据跨域需求调整

# 生成Streamlit的ASGI实例
st_app = st_server.Server(st_config).get_asgi_app()

# 3. 创建主应用,挂载两个子应用
main_app = FastAPI()
main_app.mount("/api/v1", app=api_app)
main_app.mount("/app", app=st_app)

步骤3:启动应用

通过Uvicorn启动主应用:

uvicorn main:main_app --host 0.0.0.0 --port 8080

验证访问

  • FastAPI API:访问 http://<你的服务器IP>:8080/api/v1/health,可看到API响应
  • Streamlit应用:访问 http://<你的服务器IP>:8080/app,可进入Streamlit界面

关键注意事项

  • Streamlit路径配置:必须设置server.baseUrlPath为/app,否则Streamlit的静态资源、WebSocket连接会出现路径错误,导致页面加载异常。
  • 跨域设置:若前端需要跨域访问,需为FastAPI添加CORSMiddleware,同时根据需求调整Streamlit的server.enableCORS参数。
  • 生产环境优化:生产环境建议使用Gunicorn搭配Uvicorn作为服务器,提升并发处理能力,示例启动命令:
    gunicorn main:main_app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8080
    

内容的提问来源于stack exchange,提问作者João Paraná

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:21:10