中间件

中间件

中间件是django 的门户,所有的请求和响应都要通过中间件

django中自带的有7个中间件,

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

我们简单的看一下里面几个的源码


class SessionMiddleware(MiddlewareMixin):
   
    def process_request(self, request):
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
        request.session = self.SessionStore(session_key)

    def process_response(self, request, response):
        return response


class CsrfViewMiddleware(MiddlewareMixin):
   
    def process_request(self, request):
        csrf_token = self._get_token(request)
        if csrf_token is not None:
            # Use same token next time.
            request.META['CSRF_COOKIE'] = csrf_token

    def process_view(self, request, callback, callback_args, callback_kwargs):
        return self._accept(request)

    def process_response(self, request, response):
        return response

我们从这两个中间件的源码可以看出,他们都有process_request process_response两个方法,所以这个是我们需要掌握的方法,另外的三个是需要了解的process_view,process_template_response,process_exception

自定义中间件

在一个项目或者应用名下常见一个任意的文件夹,在文件夹内常见任意名称的py文件,在该py文件内需要书写类(类要结成MiddlewareMixin)在这个里面书写自定义的五个方法,然后将类的路径已字符串的形式注册到配置文件中才能生效

首先我们在项目app01里面创建一个mymiddel文件夹,在里面创建py文件,然后自定义我们的中间件,最后注册到settings里面

from django.utils.deprecation import MiddlewareMixin



class MyMiddelware1(MiddlewareMixin):
    def process_request(self, request):
        print('这是我的第1个中间间里面的process_reuqest')

    def process_response(self, request, response):
        print('这是我的第1个中间件里面的process_response方法')
        return response

    def process_view(self,request,*args,**kwargs):
        print(args,kwargs)
        print('这是我的第1个中间件里面的process_view方法')

    def prcoess_template_response(self,request,response):
        print('这是我的第1个中间件里面的prcoess_template_response方法')
        return response

    def process_exception(self,request,exception):
        print('这是我的第1个中间件里面的process_exception方法')
        print(exception)

class MyMiddelware2(MiddlewareMixin):
    def process_request(self, request):
        print('这是我的第2个中间间里面的process_request')

    def process_response(self, request, response):
        print('这是我的第2个中间件里面的process_response方法')
        return response

    def process_view(self, request, *args, **kwargs):
        print(args, kwargs)
        print('这是我的第2个中间件里面的process_view方法')

    def prcoess_template_response(self, request, response):
        print('这是我的第2个中间件里面的prcoess_template_response方法')
        return response

    def process_exception(self, request, exception):
        print('这是我的第2个中间件里面的process_exception方法')
        print(exception)

view视图

def index(request):
    print('index视图函数')
    return HttpResponse('这是index的内容')

答案:

这是我的第1个中间间里面的process_reuqest
这是我的第2个中间间里面的process_request
(<function index at 0x000001571ED49AE8>, (), {}) {}
这是我的第1个中间件里面的process_view方法
(<function index at 0x000001571ED49AE8>, (), {}) {}
这是我的第2个中间件里面的process_view方法
index视图函数
这是我的第2个中间件里面的process_response方法
这是我的第1个中间件里面的process_response方法

process_request

  • 从这里我们可以看出我们在输入url 请求的时候,都需要经过每一个中间件里面的process_request方法,他们的执行顺序是按照注册中间件的自上而下执行

  • 没有中间件里面定义该方法,直接跳过执行下一个

  • 如果在该方法中返回一个HttpResponse对象,请求将不再继续执行,原路返回,证明校验失败,不允许访问(截胡)

  • process_request方法是用来做全局相关功能的

process_response

  • 响应走的时候需要每一个中间件里面的方法process_response ,里面的参数·response 就是django后端返回给浏览器的内容,默认返回的是形参response,也可以返回自己的
  • 没有中间件里面定义该方法,直接跳过执行下一个
  • 而且它返回的方式像FIFO的形式,先进先出

process_view(了解)

(<function index at 0x000001571ED49AE8>, (), {}) {}

  • 路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法
  • 顺序是按照配置文件中注册的中间件从上往下的顺序依次执行

prcoess_template_response(了解)

  • 返回的HttpResponse对象有render属性的时候才会触发
  • 顺序是按照配置文件中注册了的中间件从下往上依次经过

process_exception

  • 当视图函数中出现异常的情况下触发
  • 顺序是按照配置文件中注册了的中间件从下往上依次经过
posted @ 2020-06-08 17:46  小子,你摊上事了  阅读(80)  评论(0编辑  收藏  举报