Middleware and Hooks in Flask


Introduction

Flask allows you to run functions at various points during the request-response cycle using hooks and middleware. Hooks, such as before_request and after_request, are useful for adding functionality to requests and responses. Middleware can be used to modify requests or responses globally. This article explains how to use these features in Flask step by step.

Step 1: Setting Up Flask

Start by installing Flask if you haven't already:

            pip install flask
        

Create a basic Flask application:

            from flask import Flask

            app = Flask(__name__)

            @app.route('/')
            def home():
                return 'Welcome to the Flask App!'

            if __name__ == '__main__':
                app.run(debug=True)
        

Step 2: Using the before_request Hook

The before_request hook allows you to run a function before each request is processed. It is useful for tasks like logging, authentication, or modifying the request object.

For example, let's log a message before each request:

            @app.before_request
            def before_request():
                print('A request is about to be processed.')
        

This function will run before the main request handler, allowing you to perform any necessary tasks before the request is passed to the corresponding view function.

Step 3: Using the after_request Hook

The after_request hook runs after a request is processed but before the response is sent back to the client. You can use it to modify the response object or perform cleanup tasks.

For example, let's log a message after each request and modify the response:

            @app.after_request
            def after_request(response):
                print('A request has been processed.')
                response.headers['X-Custom-Header'] = 'Custom Value'
                return response
        

The after_request function modifies the response by adding a custom header and prints a message after processing the request.

Step 4: Writing Custom Middleware

Middleware is a way to process requests globally, either before or after a request. Flask provides a simple way to create middleware by defining a function that wraps the application.

For example, let's create a custom middleware function to log the details of each request:

            @app.wsgi_app
            def custom_middleware(environ, start_response):
                print('Custom Middleware: Request received')
                return app.wsgi_app(environ, start_response)
        

In this example, the custom_middleware function is wrapped around the WSGI application. It prints a message every time a request is received. You can also modify the request or response inside this middleware.

Step 5: Combining Hooks and Middleware

You can combine before_request, after_request, and custom middleware to perform a sequence of tasks at different stages of the request-response cycle.

For example, let's use all three methods:

            @app.before_request
            def before_request():
                print('Before Request: Task before processing the request.')

            @app.after_request
            def after_request(response):
                print('After Request: Task after processing the request.')
                response.headers['X-Processed-By'] = 'Flask'
                return response

            @app.wsgi_app
            def custom_middleware(environ, start_response):
                print('Custom Middleware: Processing the request globally.')
                return app.wsgi_app(environ, start_response)
        

This example shows the combination of the before_request and after_request hooks, as well as custom middleware to modify the request and response, log details, and add headers.

Step 6: Testing the Application

Run the application:

            python app.py
        

Visit http://127.0.0.1:5000/ in your browser. Check the console output for the log messages from the hooks and middleware, and inspect the response headers for any custom values.

Conclusion

Flask hooks like before_request and after_request are powerful tools for adding functionality to requests and responses. Custom middleware allows you to process requests globally, giving you more control over your application’s behavior. By combining these tools, you can build flexible and maintainable Flask applications.





Advertisement