如何在django中设置自定义中间件

我正在尝试创build中间件来select性地将kwarg传递给满足条件的每个视图。

问题是我找不到如何设置中间件的例子。 我已经看到了重写我想要的方法process_view的类:

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

但是我把这个课程放在哪里? 我是否创build了一个中间件应用程序,并将其放入其中,然后在settings.middleware中引用它?

第一:path结构

如果你没有它,你需要在你的应用程序中创build中间件文件夹:

 yourproject/yourapp/middleware 

文件夹中间件应该放在与settings.py,url,模板相同的文件夹中…

重要提示:不要忘记在中间件文件夹中创build__init__.py空文件,以便您的应用程序识别此文件夹

第二:创build中间件

现在我们应该为我们的自定义中间件创build一个文件,在这个例子中,我们假设我们需要一个中间件来根据他们的IP来过滤用户,我们用这个代码在中间件文件夹中创build一个名为filter_ip_middleware.py的文件:

 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 

第三:在我们的“settings.py”中添加中间件

我们需要寻找:

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

在settings.py里面,我们需要添加我们的中间件( 把它添加到最后的位置 )。 它应该是这样的:

 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' ) 

完成! 现在,每个客户端的每个请求都会调用您的自定义中间件并处理您的自定义代码!

当你知道在视图中发生了什么types的exception时,这将是有帮助的。 从上面我创build了我自己的自定义类像

 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" 

在string和整数加法的情况下发生exception时执行。

你可以为上面的中间件类编写对应的视图