中间键request、response、exception的运行流程及原理

在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脏


process_exception不会捕获本身产生的异常,它只会捕获view产生的异常

猜你喜欢

转载自blog.csdn.net/yx1179109710/article/details/81227067
今日推荐