@ -60,6 +60,7 @@ from pydantic import BaseModel
from starlette import routing
from starlette . concurrency import run_in_threadpool
from starlette . exceptions import HTTPException
from starlette . middleware import Middleware
from starlette . requests import Request
from starlette . responses import JSONResponse , Response
from starlette . routing import (
@ -459,6 +460,7 @@ class APIRoute(routing.Route):
generate_unique_id_function : Union [
Callable [ [ " APIRoute " ] , str ] , DefaultPlaceholder
] = Default ( generate_unique_id ) ,
middleware : Optional [ Sequence [ Middleware ] ] = None ,
) - > None :
self . path = path
self . endpoint = endpoint
@ -566,8 +568,13 @@ class APIRoute(routing.Route):
name = self . unique_id ,
embed_body_fields = self . _embed_body_fields ,
)
self . middleware = middleware
self . app = request_response ( self . get_route_handler ( ) )
if middleware is not None :
for cls , args , kwargs in reversed ( middleware ) :
self . app = cls ( self . app , * args , * * kwargs )
def get_route_handler ( self ) - > Callable [ [ Request ] , Coroutine [ Any , Any , Response ] ] :
return get_request_handler (
dependant = self . dependant ,
@ -833,6 +840,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this router .
Router - level middleware is executed after application - level middleware .
When multiple routers declare middleware , the outermost ( furthest ) router ' s middleware runs first.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > None :
super ( ) . __init__ (
routes = routes ,
@ -841,6 +863,7 @@ class APIRouter(routing.Router):
on_startup = on_startup ,
on_shutdown = on_shutdown ,
lifespan = lifespan ,
middleware = middleware ,
)
if prefix :
assert prefix . startswith ( " / " ) , " A path prefix must start with ' / ' "
@ -858,6 +881,7 @@ class APIRouter(routing.Router):
self . route_class = route_class
self . default_response_class = default_response_class
self . generate_unique_id_function = generate_unique_id_function
self . middleware = middleware
def route (
self ,
@ -911,6 +935,7 @@ class APIRouter(routing.Router):
generate_unique_id_function : Union [
Callable [ [ APIRoute ] , str ] , DefaultPlaceholder
] = Default ( generate_unique_id ) ,
middleware : Optional [ List [ Middleware ] ] = None ,
) - > None :
route_class = route_class_override or self . route_class
responses = responses or { }
@ -930,6 +955,9 @@ class APIRouter(routing.Router):
current_generate_unique_id = get_value_or_default (
generate_unique_id_function , self . generate_unique_id_function
)
if middleware and self . middleware :
middleware = self . middleware + middleware
route = route_class (
self . prefix + path ,
endpoint = endpoint ,
@ -957,6 +985,7 @@ class APIRouter(routing.Router):
callbacks = current_callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = current_generate_unique_id ,
middleware = middleware or self . middleware ,
)
self . routes . append ( route )
@ -989,6 +1018,7 @@ class APIRouter(routing.Router):
generate_unique_id_function : Callable [ [ APIRoute ] , str ] = Default (
generate_unique_id
) ,
middleware : Optional [ List [ Middleware ] ] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
def decorator ( func : DecoratedCallable ) - > DecoratedCallable :
self . add_api_route (
@ -1017,6 +1047,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
return func
@ -1328,6 +1359,7 @@ class APIRouter(routing.Router):
callbacks = current_callbacks ,
openapi_extra = route . openapi_extra ,
generate_unique_id_function = current_generate_unique_id ,
middleware = route . middleware ,
)
elif isinstance ( route , routing . Route ) :
methods = list ( route . methods or [ ] )
@ -1694,6 +1726,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP GET operation .
@ -1738,6 +1785,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def put (
@ -2071,6 +2119,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP PUT operation .
@ -2120,6 +2183,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def post (
@ -2453,6 +2517,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP POST operation .
@ -2502,6 +2581,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def delete (
@ -2835,6 +2915,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP DELETE operation .
@ -2879,6 +2974,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def options (
@ -3212,6 +3308,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP OPTIONS operation .
@ -3256,6 +3367,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def head (
@ -3589,6 +3701,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP HEAD operation .
@ -3638,6 +3765,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def patch (
@ -3971,6 +4099,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP PATCH operation .
@ -4020,6 +4163,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def trace (
@ -4353,6 +4497,21 @@ class APIRouter(routing.Router):
"""
) ,
] = Default ( generate_unique_id ) ,
middleware : Annotated [
Optional [ Sequence [ Middleware ] ] ,
Doc (
"""
List of middleware to apply to all requests handled by this route .
Route - level middleware is executed after application - level and router - level middleware .
Any middleware declared on the router will be called before this route ' s middleware.
Middleware are applied in reverse order : the last middleware in this list is the first to be called .
Read more about it in the
[ FastAPI docs for Middleware ] ( https : / / fastapi . tiangolo . com / advanced / middleware / )
"""
) ,
] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
"""
Add a * path operation * using an HTTP TRACE operation .
@ -4402,6 +4561,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
@deprecated (