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 recognizes this folder
Instead of having a separate folder containing your middleware classes, it is also possible to put your functions in a single file,
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 address, we create a file called filter_ip_middleware.py:
#yourproject/yourapp/middleware/filter_ip_middleware.py from django.core.exceptions import PermissionDenied class FilterIPMiddleware(object): # Check if client IP address is allowed def process_request(self, request): allowed_ips = ['192.168.1.1', '18.104.22.168', etc...] # Authorized ip's ip = request.META.get('REMOTE_ADDR') # Get client IP address if ip not in allowed_ips: raise PermissionDenied # If user is not allowed raise Error # If IP address is allowed we don't do anything return None
Third: Add the middleware in our 'settings.py'
We need to look for the
MIDDLEWARE_CLASSES inside the settings.py and there we need to add our middleware (Add it in the last position). It should be like:
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!