fastapi支持对 @wraps 的处理,在你的装饰器加入@wraps修饰即可。如下
def my_decorate(func):
@wraps(func)
async def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
原理:
@wraps, 这个装饰器用于将函数的信息转存到你的装饰器,包括('__module__', '__name__', '__qualname__', '__doc__', '__annotations__') ('__dict__',) 这几个变量,同时额外添加了一个
__wrapped__ 魔法变量,这个变量记录的是被装饰的原始函数。
fastapi 内部对 __wrapped__ 魔法变量做了特殊处理,当fastapi看到有这个变量,就转而处理变量指向的函数, 所以只需要给装饰器函数添加__wrapped__即可。如下
def get_roles(request:Request, a: int=1, b:str="test"):
print(a,b)
return b
def test(*args, **kwargs):
return get_roles(*args, **kwargs)
test.__wrapped__ = get_roles
router.add_api_route("test", test)
当然直接用@wraps 就行。