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 settings.py, urls, templates…
Important: Don’t forget to create the __init__.py 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 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', '126.96.36.199', 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 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' '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 !
It will be helpful in the case of When you know what type of Exception occurs in the views.
From the above I have Created my own Custom class like
from .models import userDetails class customMiddleware(object): def process_request(self,request): result='' users = userDetails.objects.all() print '-->',users ,'---From middleware calling ---' username=request.POST.get("username") salary = request.POST.get("salary") if salary: try: result = username+int(salary) except: print "Can't add"
It will be executed when the exception occur in the case of string and integer addition.
You can write Corresponding views for above middleware class