Django--进阶--中间件的使用

- 中间件是什么?

它是一个轻量级、底层的“插件”系统,用于在全局修改Django 的输入或输出。

AuthenticationMiddleware ,它使用会话将用户和请求关联起来。

这篇文档讲解中间件如何工作、如何激活中间件以及如何编写你自己的中间件。

注册中间件

要激活一个中间件组件,需要把它添加到Django 配置文件中的MIDDLEWARE元组中。

在MIDDLEWARE中,每一个中间件组件用字符串的方式描述:一个完整的Python全路径加上中间件的类名称。

例如,使用 django-admin创建工程的时候生成的默认值:

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程序中,中间件并不是必须的,你要你喜欢,MIDDLEWARE 可以为空,但是强烈推荐至少使用CommonMiddleware

MIDDLEWARE 中的顺序非常重要,因为一个中间件可能依赖于另外一个,例如

AuthenticationMiddleware依赖于SessionMiddleware,因为AuthenticationMiddleware通过session中存储认证通过的用户。

钩子和应用的顺序

在请求阶段中,调用视图前,django会按照MIDDLEWARE 中定义的顺序向下执行中间件,会用到连个钩子:

  1. process_request()
  2. process_view()

在响应阶段,调用视图函数之后,中间件会按照相反的顺序应用,自底向上。会用到三个钩子:

  1. process_exception() (仅当视图抛出异常的时候)
  2. process_template_respose()(仅用于模板响应)
  3. process_response()

Django--进阶--中间件的使用

Django--进阶--中间件的使用

自定义中间件

每个中间件组件是一个独立的Python 类,你可以定义下面这些方法中的一个或多个:


process_request(request)

process_request()会在每个请求上调用。

HttpResponse对象。

process_view()中间件,最后是对应的视图。

它将对HttpResponse运用响应阶段的中间件,并返回结果。

process_response

process_response(request, response)

StreamingHttpResponse对象。

process_response()在所有响应返回浏览器之前被调用。

StreamingHttpResponse对象。

process_request()方法中的设置。

意思是定义在MIDDLEWARE最底下的类会最先被运行。


  • 中间件的类不能是任何类的子类。
  • IDDLEWARE中的配置。

示例代码

# encoding:utf-8
# Author:"richie"
# Date:11/6/2017
from django.conf import settings
from django.shortcuts import redirect


class MiddlewareMixin(object):
    """
    这是一个基类,为了更好的解耦,我们直接本地化这个类,而不继承django中定义的
    """
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, 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 AuthMiddleware(MiddlewareMixin):
    """
    用户登录验证中间件
    """
    def process_request(self, request):
        # 遇到登录path和注册path不进行登录验证,直接返回None
        if request.path_info == '/user/login/' or 
                        request.path_info == '/user/register/':
            return None
        # 获取session信息,如果session中没有登录后的传递的字段,就跳转到登录页面
        if not request.session.get(settings.SESSION_KEY):
            return redirect('/user/login/')