0
0
Flaskframework~5 mins

Custom middleware creation in Flask

Choose your learning style9 modes available
Introduction

Middleware lets you add extra steps to handle requests and responses in your web app. It helps you run code before or after your app processes data.

You want to log every request and response for debugging.
You need to check user authentication before allowing access.
You want to modify request data before your app uses it.
You want to add custom headers to all responses.
You want to handle errors in a centralized way.
Syntax
Flask
from flask import Flask, request

class CustomMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        # Code before request
        print(f"Before request: {environ['PATH_INFO']}")

        def custom_start_response(status, headers, exc_info=None):
            # Code before response
            print(f"Before response: {status}")
            return start_response(status, headers, exc_info)

        return self.app(environ, custom_start_response)

app = Flask(__name__)
app.wsgi_app = CustomMiddleware(app.wsgi_app)

@app.route('/')
def home():
    return "Hello from Flask!"

The middleware class wraps the Flask app's WSGI app.

The __call__ method handles each request and response.

Examples
This middleware just prints a message before passing the request on.
Flask
class SimpleMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        print("Request received")
        return self.app(environ, start_response)
This middleware adds a custom header to every response.
Flask
class HeaderMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        def custom_start_response(status, headers, exc_info=None):
            headers.append(("X-Custom-Header", "MyValue"))
            return start_response(status, headers, exc_info)
        return self.app(environ, custom_start_response)
Sample Program

This Flask app uses a custom middleware to print the request path before handling it and the response status before sending it back.

Flask
from flask import Flask

class LoggingMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        path = environ.get('PATH_INFO', '')
        print(f"Request path: {path}")

        def custom_start_response(status, headers, exc_info=None):
            print(f"Response status: {status}")
            return start_response(status, headers, exc_info)

        return self.app(environ, custom_start_response)

app = Flask(__name__)
app.wsgi_app = LoggingMiddleware(app.wsgi_app)

@app.route('/')
def index():
    return "Welcome to the homepage!"

@app.route('/about')
def about():
    return "About page here."
OutputSuccess
Important Notes

Middleware runs for every request, so keep it fast and simple.

You can chain multiple middleware by wrapping app.wsgi_app multiple times.

Middleware works at the WSGI level, so it can handle requests before Flask routes them.

Summary

Middleware lets you add code before and after Flask handles requests.

Create a class with __call__ to wrap the Flask app.

Use middleware to log, modify, or check requests and responses easily.