在middleware.py中定义中间键:
from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixin class MyMiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MyMiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response # 自定义中间键 class ZBB(MyMiddlewareMixin): def process_request(self, request): print('ZBB----->request脏') def process_view(self, request, view_func, view_args, view_kwargs): print('ZBB----->view脏') def process_response(self, request, response): print('ZBB------>response脏') return response def process_exception(self, request, exception): print('ZBB------>exception脏') class JBB(MyMiddlewareMixin): def process_request(self, request): print('JBB------->request假') def process_view(self, request, view_func, view_args, view_kwargs): print('JBB----->view假') def process_response(self, request, response): print('JBB------->response假') return response def process_exception(self, request, exception): print('JBB------>exception假') class ZZD(MyMiddlewareMixin): def process_request(self, request): print('ZZD------->request顶') def process_view(self, request, view_func, view_args, view_kwargs): print('ZDD----->view顶') def process_response(self, request, response): print('ZZD------->response顶') return response def process_exception(self, request, exception): print('ZZD------>exception顶') # 利用中间键封某个IP class ipBlockMiddleWare(MyMiddlewareMixin): def process_request(self, request): remote_addr = request.environ.get('REMOTE_ADDR', None) if remote_addr and remote_addr == '10.3.141.113': return HttpResponse('卫哥大垃圾!') # 官网写法 def simple_middleware(get_response): def middleware(request): remote_addr = request.environ.get('REMOTE_ADDR', None) if remote_addr and remote_addr == '10.3.141.113': return HttpResponse('卫哥大垃圾!') response = get_response(request)
在settings.py中注册:
from django.middleware.security import SecurityMiddleware MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'middlewareapp.middleware.ZBB', 'middlewareapp.middleware.JBB', 'middlewareapp.middleware.ZZD', 'middlewareapp.middleware.ipBlockMiddleWare', 'middlewareapp.middleware.simple_middleware', ]
在views.py中:
from django.shortcuts import render, HttpResponse # Create your views here. def index(request): print('View') # int('innbnnnnn') return HttpResponse('hello middleware')
没有错误时的运行过程:
ZBB----->request脏
JBB------->request假
ZZD------->request顶
ZBB----->view脏
JBB----->view假
ZDD----->view顶
View
ZZD------->response顶
JBB------->response假
ZBB------>response脏
当错误出现在views.py中的函数里的执行过程:
System check identified no issues (0 silenced).
July 26, 2018 - 21:28:08
Django version 1.11.7, using settings 'hello.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.
ZBB----->request脏
JBB------->request假
ZZD------->request顶
ZBB----->view脏
JBB----->view假
ZDD----->view顶
View
ZZD------>exception顶
JBB------>exception假
ZBB------>exception脏
Internal Server Error: /middlewareapp/index/
Traceback (most recent call last):
File "E:\django\django_venv\gz1802review\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "E:\django\django_venv\gz1802review\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "E:\django\django_venv\gz1802review\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\django\django_demo\day01\hello\middlewareapp\views.py", line 7, in index
int('innbnnnnn')
ValueError: invalid literal for int() with base 10: 'innbnnnnn'
ZZD------->response顶
JBB------->response假
ZBB------>response脏
[26/Jul/2018 21:28:13] "GET /middlewareapp/index/ HTTP/1.1" 500 64691
当错误出现在ZBB的process_view下面的执行过程:
System check identified no issues (0 silenced).
July 26, 2018 - 21:33:38
Django version 1.11.7, using settings 'hello.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.
ZBB----->request脏
JBB------->request假
ZZD------->request顶
ZBB----->view脏
Internal Server Error: /middlewareapp/index/
Traceback (most recent call last):
File "E:\django\django_venv\gz1802review\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "E:\django\django_venv\gz1802review\lib\site-packages\django\core\handlers\base.py", line 178, in _get_response
response = middleware_method(request, callback, callback_args, callback_kwargs)
File "E:\django\django_demo\day01\hello\middlewareapp\middleware.py", line 28, in process_view
int('dsdsdsdsd')
ValueError: invalid literal for int() with base 10: 'dsdsdsdsd'
[26/Jul/2018 21:33:43] "GET /middlewareapp/index/ HTTP/1.1" 500 60537
ZZD------->response顶
JBB------->response假
ZBB------>response脏