Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set up 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 set up 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 settings.middleware?

like image 256
Atma Avatar asked Aug 19 '13 20:08

Atma


People also ask

How does Django implement middleware?

Activating middleware To activate a middleware component, add it to the MIDDLEWARE list in your Django settings. A Django installation doesn't require any middleware — MIDDLEWARE can be empty, if you'd like — but it's strongly suggested that you at least use CommonMiddleware .

What is middleware can we create custom middleware?

In a nutshell, a Middleware is a regular Python class that hooks into Django's request/response life cycle. Those classes holds pieces of code that are processed upon every request/response your Django application handles.

What is a middleware in Django?

Middleware is a framework of hooks into Django's request/response processing. It's a light, low-level “plugin” system for globally altering Django's input or output. Each middleware component is responsible for doing some specific function.


1 Answers

First: The path structure

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

yourproject/yourapp/middleware 

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

Important: Don't forget to create the init.py empty file inside the middleware folder so your app recognizes this folder

Second: Create the middleware

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

class FilterIPMiddleware(object):     # Check if client IP is allowed     def process_request(self, request):         allowed_ips = ['192.168.1.1', '123.123.123.123', 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 'settings.py'

We need to look for:

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

Inside the settings.py we need to add our middleware (Add it in the last position). It should look like:

MIDDLEWARE = ( #  Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES'     'django.middleware.common.CommonMiddleware',     'django.contrib.sessions.middleware.SessionMiddleware',     'django.middleware.csrf.CsrfViewMiddleware',     'django.contrib.auth.middleware.AuthenticationMiddleware',     'django.contrib.messages.middleware.MessageMiddleware',      # Above are django standard middlewares       # Now we add here our custom middleware      'yourapp.middleware.filter_ip_middleware.FilterIPMiddleware' ) 

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

like image 199
AlvaroAV Avatar answered Sep 24 '22 02:09

AlvaroAV