Last modified: Nov 15, 2024 By Alexander Williams

Flask before_request: Execute Functions Before Each Request

In Flask, before_request() is a powerful decorator that allows you to execute functions before each request is processed. This feature is essential for implementing authentication, logging, and request preprocessing.

Understanding before_request()

The before_request() decorator registers functions that run before each request to your application. These functions can modify the request, validate user sessions, or perform any preprocessing tasks.

Basic Implementation


from flask import Flask, g
app = Flask(__name__)

@app.before_request
def before_request_function():
    print("This function runs before each request")
    g.user = "example_user"

@app.route('/')
def home():
    return f"Hello, {g.user}!"

Authentication Example

One common use case for before_request() is implementing authentication checks. Here's how you can protect your routes using this feature along with the Flask g Object:


from flask import Flask, g, redirect, request
from functools import wraps

app = Flask(__name__)

@app.before_request
def check_user_auth():
    if 'user_id' not in session and request.endpoint != 'login':
        return redirect('/login')
    g.user = get_user_from_session()  # Your authentication logic here

Request Preprocessing

You can use before_request() to process or validate incoming data before it reaches your route handlers. This is particularly useful when working with Flask Request data.


@app.before_request
def process_request_data():
    if request.method == 'POST':
        if not request.is_json:
            return {"error": "Content type must be application/json"}, 400
        g.json_data = request.get_json()

Logging Implementation

Implement request logging using before_request() to track application usage and debug issues:


import logging
from datetime import datetime

@app.before_request
def log_request_info():
    g.start_time = datetime.now()
    logging.info(f"Request: {request.method} {request.url} at {g.start_time}")

Error Handling

The before_request() function can also be used to handle errors and exceptions before they reach your routes:


@app.before_request
def handle_exceptions():
    try:
        validate_request()
    except ValidationError:
        return {"error": "Invalid request"}, 400

Best Practices

  • Keep functions focused: Each before_request function should have a single responsibility
  • Use g object for sharing data between before_request and route handlers
  • Handle errors gracefully to prevent application crashes

Conclusion

Flask's before_request() decorator is a versatile tool for implementing preprocessing logic, authentication, and logging in your web applications. When used correctly, it helps maintain clean and organized code.