Writing middlewaresΒΆ

Middlewares are basically decorators that are run in a queue fashion when a request hits an endpoint. You can use as many middlewares to handle incoming requests using the methods provided by the Route class.

A simple middleware:

from functools import wraps
from flask import has_request_context

def mock_middleware(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        assert has_request_context()
        return fn(*args, **kwargs)
    return wrapper

A middleware that checks if the mimetype indecates JSON data:

from functools import wraps
from flask import request

def is_json(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        if not request.is_json:
            return { 'success': False }, 400
        return fn(*args, **kwargs)
    return wrapper

Using this signature, we can write middlewares that do all sorts of handling, and use them all together with routing methods provided by the Route class.

from flask_mux import Router
from flask_jwt_extended import jwt_required

user_router = Router()

user_router.post('/new', jwt_required, is_auth, is_json, view_func)

In this example, we are invoking 3 middlewares (jwt_required, is_auth, is_json) to filter out the incoming request before moving to the actual view function.

When a request hits an endpoint, the middlewares will be invoked in the same order they were passed.