FastAPI路由函数用*args触发TypeError的原因及解决方法
错误原因与解决方法
错误原因
当你给函数添加@router.get("/greet")路由装饰器后,FastAPI(或同类ASGI框架)调用路由处理函数时,会以关键字参数的形式传递请求相关参数,而非位置参数。你的greet(*args)仅定义了接收位置参数的*args,无法匹配框架传递的关键字参数(框架尝试传递args这类关键字参数时,函数没有对应参数定义),因此抛出TypeError: greet() got an unexpected keyword argument 'args'错误。
另外,HTTP GET请求的参数本身是键值对形式的查询参数,并非位置参数,直接用*args也无法正确获取这些请求参数。
解决方法
根据需求,有两种常见处理方式:
- 接收多个同名查询参数
如果需要接收多个同名的用户名称(比如请求/greet?name=Aron&name=Claus),可以用List[str]类型结合Query定义参数,FastAPI会自动将多个同名查询参数收集为列表:
from fastapi import APIRouter, Query from typing import List router = APIRouter() @router.get("/greet") def greet(name: List[str] = Query(...)): return {"greetings to users:": name}
- 接收任意多个不同名查询参数
如果需要接收任意不同的查询参数,可以通过request对象直接获取,或者用**kwargs接收:
from fastapi import APIRouter, Request router = APIRouter() # 方式1:通过request对象获取所有查询参数 @router.get("/greet") def greet(request: Request): params = dict(request.query_params) return {"received params": params} # 方式2:用**kwargs接收(若需完全任意参数,更推荐用request方式) @router.get("/greet") def greet(**kwargs): return {"greetings to users:": list(kwargs.values())}
内容的提问来源于stack exchange,提问作者ttuff
相关产品推荐
相关产品推荐

