如何通过FastAPI挂载多个Gradio应用?解决端点404问题
解决FastAPI挂载多个Gradio应用的404问题
你的代码核心问题是变量覆盖导致挂载失效:
- 你先执行了
app.mount('/debug', sub_app),此时挂载的是一个空的FastAPI实例; - 之后
sub_app = gr.mount_gradio_app(...)让变量指向了新的、带有Gradio应用的对象,但主app挂载的还是最初那个空实例,所以访问/debug会返回404。
修正后的代码
调整挂载顺序,先给子应用配置Gradio,再挂载到主应用:
from fastapi import FastAPI from functools import partial import gradio as gr app = FastAPI() def out(text, n): return text + '!'*n def make_simple_gr_app(n): func = partial(out, n=n) with gr.Blocks() as dbg: textbox = gr.Textbox(max_lines=1, label='Enter text') submit_btn = gr.Button('Submit') submit_btn.click(func, inputs=textbox, outputs=textbox) return dbg # 先配置子应用的Gradio,再挂载到主应用的/debug路径 sub_app = gr.mount_gradio_app(FastAPI(), make_simple_gr_app(1), '/') app.mount('/debug', sub_app) # 配置主应用根路径的Gradio app = gr.mount_gradio_app(app, make_simple_gr_app(5), '/')
更简洁的写法
可以直接在挂载时完成子应用的创建和配置,省去单独的变量:
from fastapi import FastAPI from functools import partial import gradio as gr app = FastAPI() def out(text, n): return text + '!'*n def make_simple_gr_app(n): func = partial(out, n=n) with gr.Blocks() as dbg: textbox = gr.Textbox(max_lines=1, label='Enter text') submit_btn = gr.Button('Submit') submit_btn.click(func, inputs=textbox, outputs=textbox) return dbg # 直接创建并挂载带Gradio的子应用到/debug app.mount( '/debug', gr.mount_gradio_app(FastAPI(), make_simple_gr_app(1), '/') ) # 挂载根路径的Gradio应用 app = gr.mount_gradio_app(app, make_simple_gr_app(5), '/')
修改后,localhost:8000和localhost:8000/debug都能正常加载对应的Gradio应用。
内容的提问来源于stack exchange,提问作者Chrispresso
相关产品推荐
相关产品推荐

