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

FastAPI中使用自定义APIRoute路由类时出现TypeError错误

FastAPI中使用自定义APIRoute路由类时出现TypeError错误

嘿,我看了你的代码和报错信息,这个TypeError: the first argument must be callable错误其实很好解决——问题出在你自定义路由处理函数的异常捕获返回值上!

在你的LoggingAPIRoute类里,custom_route_handler的except块中,你直接返回了字符串"oh snap!":

except Exception as e:
    return "oh snap!"

但FastAPI/Starlette的路由处理函数要求返回的必须是一个可调用的Response对象实例(比如JSONResponse、PlainTextResponse这类),而普通字符串并不满足这个要求。当框架尝试处理这个字符串返回值时,会把它当作可调用对象去执行,自然就抛出了“必须是可调用类型”的错误。

修复方案

只需要把异常返回改成合法的Response对象即可,比如用PlainTextResponse或者JSONResponse:

首先在questions.py顶部导入对应的响应类:

from fastapi import APIRouter, Request, Response, PlainTextResponse  # 新增PlainTextResponse

然后修改异常捕获块的返回逻辑:

except Exception as e:
    # 返回一个PlainTextResponse,指定状态码为500(服务器错误)
    return PlainTextResponse("oh snap!", status_code=500)

这样修改后,你的自定义路由类就能正常工作了——返回的是符合要求的Response实例,框架可以正确处理它,不会再抛出类型错误。

额外提示

如果你想更规范地处理异常,也可以考虑使用FastAPI自带的异常处理机制(比如HTTPException),这样能更好地和框架的错误处理流程整合:

from fastapi import HTTPException

# ... 其他代码 ...
except Exception as e:
    raise HTTPException(status_code=500, detail="oh snap!")

这种方式会让框架自动生成标准的错误响应格式,也同样能解决你的问题。

备注:内容来源于stack exchange,提问作者Yuv_c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:34:30