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
?
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 .
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.
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.
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
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
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With