如何在同一服务器端口集成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á
相关产品推荐
相关产品推荐

