@ -61,6 +61,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 (
@ -460,6 +461,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
@ -567,8 +569,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 ,
@ -834,6 +841,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 ,
@ -842,6 +864,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 ' / ' "
@ -859,6 +882,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 ,
@ -912,6 +936,7 @@ class APIRouter(routing.Router):
generate_unique_id_function : Union [
Callable [ [ APIRoute ] , str ] , DefaultPlaceholder
] = Default ( generate_unique_id ) ,
middleware : Optional [ Sequence [ Middleware ] ] = None ,
) - > None :
route_class = route_class_override or self . route_class
responses = responses or { }
@ -931,6 +956,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 = list ( self . middleware ) + list ( middleware )
route = route_class (
self . prefix + path ,
endpoint = endpoint ,
@ -958,6 +986,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 )
@ -990,6 +1019,7 @@ class APIRouter(routing.Router):
generate_unique_id_function : Callable [ [ APIRoute ] , str ] = Default (
generate_unique_id
) ,
middleware : Optional [ Sequence [ Middleware ] ] = None ,
) - > Callable [ [ DecoratedCallable ] , DecoratedCallable ] :
def decorator ( func : DecoratedCallable ) - > DecoratedCallable :
self . add_api_route (
@ -1018,6 +1048,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
return func
@ -1329,6 +1360,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 [ ] )
@ -1695,6 +1727,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 .
@ -1739,6 +1786,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def put (
@ -2072,6 +2120,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 .
@ -2121,6 +2184,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def post (
@ -2454,6 +2518,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 .
@ -2503,6 +2582,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def delete (
@ -2836,6 +2916,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 .
@ -2880,6 +2975,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def options (
@ -3213,6 +3309,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 .
@ -3257,6 +3368,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def head (
@ -3590,6 +3702,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 .
@ -3639,6 +3766,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def patch (
@ -3972,6 +4100,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 .
@ -4021,6 +4164,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
def trace (
@ -4354,6 +4498,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 .
@ -4403,6 +4562,7 @@ class APIRouter(routing.Router):
callbacks = callbacks ,
openapi_extra = openapi_extra ,
generate_unique_id_function = generate_unique_id_function ,
middleware = middleware ,
)
@deprecated (