How can I add any decorators to FastAPI endpoints?
As you said, you need to use @functools.wraps(...)–(PyDoc) decorator as,
from functools import wraps
from fastapi import FastAPI
from pydantic import BaseModel
class SampleModel(BaseModel):
name: str
age: int
app = FastAPI()
def auth_required(func):
@wraps(func)
async def wrapper(*args, **kwargs):
return await func(*args, **kwargs)
return wrapper
@app.post("https://stackoverflow.com/")
@auth_required # Custom decorator
async def root(payload: SampleModel):
return {"message": "Hello World", "payload": payload}
The main caveat of this method is that you can’t access the request object in the wrapper and I assume it is your primary intention.
If you need to access the request, you must add the argument to the router function as,
from fastapi import Request
@app.post("https://stackoverflow.com/")
@auth_required # Custom decorator
async def root(request: Request, payload: SampleModel):
return {"message": "Hello World", "payload": payload}
I am not sure what’s wrong with the FastAPI middleware, after all, the @app.middleware(...) is also a decorator.