解析

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,

django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,

其中每一个元素就是一个中间件,

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',
]

以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,

如果是HttpResonse对象,则直接将该对象返回给用户。

  流程图

Django进阶篇(二)

上面的流程图可能有些乱,为了解流程花的草图;

Django进阶篇(二)

上面是Django 1.9版本的流程图,到django 1.10就变了;

变成了request在相对应的response中找。

Django进阶篇(二)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.shortcuts import HttpResponse


class test1Middleware(object):

    def process_request(self, request):
        print('11111111')

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('process_view1')

    def process_response(self, request, response):
        print('response 111111')
        return response

    def process_template_response(self, request, response):
        print('template1')

        return response

    def process_exception(self, request, exception):
        print('ex1')



class test2Middleware(object):

    def process_request(self, request):

        #if request.META['REMOTE_ADDR'] in ['1.1.1.1','1.1.1.2']:
        #    return HttpResponse('SB')
        # return HttpResponse('SB')
        print('22222')

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('process_view2')

    def process_template_response(self, request, response):
        print('template2')

        return response
    def process_exception(self, request, exception):
        print('ex2')


class test3Middleware(object):

    def process_request(self, request):
        print('33333')

    def process_response(self, request, response):
        print('response 33333')
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('process_view3')

    def process_template_response(self, request, response):
        print('template3')
        return response

    def process_exception(self, request, exception):
        print('ex3')
        return HttpResponse('500')
test.py

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-22
  • 2021-10-25
  • 2021-08-23
  • 2021-06-01
  • 2022-12-23
相关资源
相似解决方案