Custom middleware for FastAPI application
FastAPI is a Python web framework for building APIs. By using a middleware, we are able to process request and response before/after they get handled by the application.
Implement custom middleware
Starlette
is a lightweight ASGI framework/toolkit on which FastAPI is based.
It provides BaseHTTPMiddleware
class for us to implement custom middleware.
It’s required to override the async def dispatch(request, call_next)
method.
from starlette.middleware.base import BaseHTTPMiddleware
class CustomHeaderMiddleware(BaseHTTPMiddleware):
def __init__(self, app, header_value='Example'):
super().__init__(app)
self.header_value = header_value
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers['Custom'] = self.header_value
return response
The example middleware above simply adds a Custom
header to the response.
FastAPI also supports using decorator to create a middleware :
@app.middleware("http")
async def custom_middleware(request: Request, call_next):
response = await call_next(request)
return response
It should have the same effect as overriding the dispatch
method.
I personally prefer the below way to programmatically add the middleware to the FastAPI application.
Add middleware to FastAPI
from fastapi import FastAPI
app = FastAPI()
app.add_middleware(CustomHeaderMiddleware, header_value='Hello')