Django中间件及自定义中间件

Django中间件

中间件介绍:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件都负责做一些特定的功能。

说的直白点中间件就是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

Django中有7个默认的中间件:

# settings.py

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

在Django的生命周期中,浏览器输入网址经过web服务网关接口(wsgiref)然后还要经过Django中间件才会到Django的路由层(请求来的时候,Django中间件是自上而下顺序执行,一旦某个中间件拦截了请求,后面的将不再执行。响应走的时候,Django中间件是自下而上逆序执行。)

自定义中间件:

在项目目录下创建一个middleware包,然后在包中新建一个my_middleware.py文件如下:

# my_middleware.py
from django.utils.deprecation import MiddlewareMixin

# 自定义类并继承MiddlewareMixin
class Mi(middlewareMixin):
    def process_request(self, request):
        print('我来自Mi哈哈哈')

然后去settings.py中注册自定义的中间件

# settings.py

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',
    
    # 自定义的中间件
    'middleware.my_middleware.Mi',
]

五个可修改的内置方法:

# 两个重点

# process_request()
"""
请求来的时候会从上往下依次经过每一个中间里面process_request,
一旦里面返回了HttpResponse对象那么就不再往后执行了,
会执行同一级别的process_response
"""
def process_request(self, request):
    print('我是process_request')
    
# process_response()
"""
响应走的时候,会从下往上一次经过每一个中间件里面的porcess_response
"""
def process_response(self, request, response):
    # response就是要返回给用户的数据
    print('我是process_response')
    return response


# 三个了解
# procesee_view(): 路由匹配成功之后执行视图函数之前触发
# process_exception: 当视图函数出现异常的时候自动触发
# process_template_response: 当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发
posted @ 2019-10-30 18:43  17vv  阅读(349)  评论(0编辑  收藏  举报