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
相关产品推荐
相关产品推荐

