FastAPI中如何设置/*路径实现全路由捕获
为什么直接写/*不生效
FastAPI底层的路由实现基于Starlette,路径匹配的语法规则和ExpressJS完全不通用——直接在路径字符串里写/*的形式不会被识别为通配匹配规则,因此所有访问请求都会触发FastAPI内置的404页面。
和ExpressJS全捕获等价的实现写法
FastAPI要匹配任意层级的全路径,需要借助内置的路径类型转换器:在路径参数后加上:path标记,就可以让这个参数匹配后续所有层级、包含斜杠的任意路径内容,完全等价于ExpressJS里/*的匹配效果。
可直接运行的示例代码:
from fastapi import FastAPI app = FastAPI() # 所有具体业务路由必须写在兜底路由的前面 # 示例: # @app.get("/api/info") # def get_info(): # return {"status": "running"} # 全路由GET捕获路由,放在文件最后注册 @app.get("/{full_path:path}") def user_lost(full_path: str): return "Sorry You Are Lost !"
必看的注意事项
- 不能漏写
:path类型标记:如果只写/{full_path}没有加类型标记,这个参数仅能匹配单级路径,访问/a/b/c这类多级嵌套路径时依然会返回404。 - 严格注意路由注册顺序:FastAPI按照代码从上到下的顺序匹配路由,一旦命中规则就直接返回结果。如果把全捕获路由放在具体业务路由的前面,所有定义好的业务路由都会被这个兜底逻辑拦截,完全无法正常访问,因此这类全捕获的兜底路由永远要放在所有业务路由的最后面。
- 如果需要覆盖所有HTTP方法(GET、POST、PUT、DELETE等)的未定义请求,可以把装饰器换成
@app.api_route("/{full_path:path}"),不需要逐一声明支持的请求方法。
内容的提问来源于stack exchange,提问作者Akash Pattnaik
相关产品推荐
相关产品推荐

