how to setup custom middleware in django

I am trying to create middleware to optionally pass a kwarg to every view that meets a condition.

The problem is that I cannot find an example of how to setup the middleware. I have seen classes that override the method I want to, process_view:

    Class CheckConditionMiddleware(object):  
        def process_view(self, request):  

            return None

But where do I put this class? Do I create a middleware app and put this class inside of it and then reference it in the settings.middleware ?

First: The path structure

If you don't have it you need to create the middleware folder within your app following the structure:


The folder middleware should be placed in the same folder as, urls, templates...

Important: Don't forget to create the empty file inside the middleware folder so your app recognize this folder

Second: Create the middleware

Now we should create a file for our custom middleware, in this example let's supose we want a middleware that filter the users based on their IP, we create a file called inside the middleware folder with this code:

    class FilterIPMiddleware(object):
        # Check if client IP is allowed
        def process_request(self, request):
            allowed_ips = ['', '', etc...] # Authorized ip's
            ip = request.META.get('REMOTE_ADDR') # Get client IP
            if ip not in allowed_ips:
                raise Http403 # If user is not allowed raise Error

           # If IP is allowed we don't do anything
           return None

Third: Add the middleware in our ''

We need to look for:

  • MIDDLEWARE_CLASSES (django < 1.10)
  • MIDDLEWARE (django >= 1.10)

Inside the and there we need to add our middleware ( Add it in the last position ). It should be like:

    MIDDLEWARE = ( #  Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES'
         # Above are django standard middlewares

         # Now we add here our custom middleware

Done ! Now every request from every client will call your custom middleware and process your custom code !