Django中间件看完这篇彻底明白( 二 )

  • Exception函数:process_exception(self, request, exception)
    执行时机:如果在执行过程中出现问题,并且抛出一个未被捕获的异常时才被调用 。我们可以用它来捕获请求错误,发送通知或者恢复错误场景 。
    如果返回None,Django将使用框架内置异常处理,并继续交给下一个exception函数;如果返回HttpResponse对象,Django将不再执行其他除process_response以外的所有函数,并中断异常处理 。
  • Response函数:process_response(self, request, response)
    执行时机:执行完view函数并生成response之后,几乎是必执行的函数 。
    返回并且只能、必须返回HttpResponse对象,否则会导致HTTP请求中断 。
  • 自定义中间件
    • 创建中间件类
    from django.utils.deprecation import MiddlewareMixinclass MyCustomMiddleware1(MiddlewareMixin):    def process_request(self, request):        print('MyCustomMiddleware1')    def process_response(self, request, response):        print('返回 MyCustomMiddleware1')        return responseclass MyCustomMiddleware2(MiddlewareMixin):    def process_request(self, request):        print('MyCustomMiddleware2')    def process_response(self, request, response):        print('返回 MyCustomMiddleware2')        return response
    • 注册中间件
    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',    'MyMiddleware.MyCustomMiddleware1',    'MyMiddleware.MyCustomMiddleware2']输出结果:
    MyCustomMiddleware1MyCustomMiddleware2返回 MyCustomMiddleware2返回 MyCustomMiddleware1系统中间件的用途
    • django.middleware.security.SecurityMiddleware主要是针对安全访问处理,就是把http请求重定向到https请求
    • django.contrib.sessions.middleware.SessionMiddleware在Django中我们用的request.session就是在process_request中进行处理的,根据我们在settings中配置的SESSION_COOKIE_NAME变量,从cookies中获取对应的值,从表中查询出session值,创建session对象,赋值给request_session对象 。
    def process_request(self, request):    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)    request.session = self.SessionStore(session_key)在process_response函数中,给response对象设置SESSION_COOKIE_NAME值和过期时间等 。
    response.set_cookie(   settings.SESSION_COOKIE_NAME,   request.session.session_key, max_age=max_age,   expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,   path=settings.SESSION_COOKIE_PATH,   secure=settings.SESSION_COOKIE_SECURE or None,   httponly=settings.SESSION_COOKIE_HTTPONLY or None,   samesite=settings.SESSION_COOKIE_SAMESITE)
    • django.middleware.common.CommonMiddleware
      检测是否允许浏览器类型
    if 'HTTP_USER_AGENT' in request.META:    for user_agent_regex in settings.DISALLOWED_USER_AGENTS:        if user_agent_regex.search(request.META['HTTP_USER_AGENT']):            raise PermissionDenied('Forbidden user agent')检查是否需要添加/,主要是根据settings中AppEND_SLASH配置
    if self.should_redirect_with_slash(request):    path = self.get_full_path_with_slash(request)else:    path = request.get_full_path()在process_response函数中,会判断是否需要把404的请求重新定向到我们需要的页面