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

在FastAPI挂载的Gradio中无按钮实现HTML展示及参数错误解决

解决FastAPI挂载Gradio时自动运行函数缺失request参数的问题

错误原因

你编写的get_user_info()函数需要FastAPI的request参数,但Gradio初始化组件时不会自动传入该对象,直接调用就会触发TypeError;而按钮点击能正常运行,是因为按钮的事件处理逻辑中,request对象被正确传递到了函数里。

两种可行解决方案

方案一:用Gradio的load事件结合依赖注入传递request

这是Gradio结合FastAPI获取request的标准方式,利用load事件在页面加载时自动调用函数,同时通过依赖注入传入request:

from fastapi import FastAPI, Request, Depends
import gradio as gr

app = FastAPI()

def get_user_info(request: Request):
    # 示例:从request中获取用户代理信息
    user_agent = request.headers.get("user-agent")
    return f"<div>当前浏览器:{user_agent}</div>"

with gr.Blocks() as demo:
    html_display = gr.HTML()
    # 页面加载时自动调用函数,通过fn_kwargs传递request依赖
    demo.load(
        get_user_info,
        inputs=None,
        outputs=html_display,
        fn_kwargs={"request": Depends(Request)}
    )

# 将Gradio挂载到FastAPI
app = gr.mount_gradio_app(app, demo, path="/")

方案二:将Gradio包装为FastAPI路由,手动传递request

如果需要完全控制路由逻辑,可以直接在FastAPI的路由中处理request,再生成Gradio页面:

from fastapi import FastAPI, Request
import gradio as gr

app = FastAPI()

def get_user_info(request: Request):
    # 示例:从request中获取客户端IP
    client_ip = request.client.host
    return f"<div>你的IP地址:{client_ip}</div>"

@app.get("/")
async def gradio_page(request: Request):
    with gr.Blocks() as demo:
        # 直接将request传入函数,生成HTML内容
        gr.HTML(get_user_info(request))
    # 渲染Gradio页面
    return demo.launch(inline=False, prevent_thread_lock=True)

关键注意事项

  • 不要在Gradio组件初始化时直接调用需要request的函数(比如gr.HTML(get_user_info())),此时还处于FastAPI的请求上下文之外,无法获取request对象,必然报错。
  • 方案一更符合Gradio与FastAPI集成的设计规范,推荐优先使用。

内容的提问来源于stack exchange,提问作者Shubhank Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:55:02