Django框架之中间件

【一】Django中间件介绍

【1】什么是Django中间件

  • Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程。

  • 它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。

  • 中间件是按照顺序依次执行的,每个中间件都可以对请求和响应进行修改、补充或处理。

  • 在Django的settings.py配置文件中,通过MIDDLEWARE设置来定义中间件的顺序。

【二】django自带的七个中间件

(1)SecurityMiddleware
  • django.middleware.security.SecurityMiddleware
    • 安全中间件负责处理与网站安全相关的任务
    • 例如设置HTTP头部,防止跨站脚本攻击(XSS),点击劫持等。
    • 它可以通过配置自定义安全策略来确保网站的安全性。
class SecurityMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):

    def process_request(self, request):

    def process_response(self, request, response):
(2)SessionMiddleware
  • django.contrib.sessions.middleware.SessionMiddleware
    • 会话中间件负责处理用户会话的创建之间存储和检索用户数据。
    • 它基于浏览器提供的Cookie或URL传递的会话ID进行会话跟踪,并将会话数据存储在后端数据库或缓存中,以实现用户状态的跨请求保持。
class SessionMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):

    def process_request(self, request):

    def process_response(self, request, response):
(3)CommonMiddleware
  • django.middleware.common.CommonMiddleware
    • 通用中间件提供了一些常见而关键的HTTP请求处理功能
    • 例如,根据请求的HTTP头信息设置语言、时区等。
    • 此外,它还处理静态文件的serving,包括收集静态文件,为其生成URL,并在开发模式下提供静态文件的serving。
(4)CsrfViewMiddleware
  • django.middleware.csrf.CsrfViewMiddleware
    • CSRF(Cross-Site Request Forgery)中间件用于防止跨站请求伪造攻击。
    • 它在每个POST请求中验证一个CSRF标记,确保请求是通过合法的表单提交得到的,从而保护用户免受恶意站点的攻击。
class CsrfViewMiddleware(MiddlewareMixin):
    def _accept(self, request):
        
    def _reject(self, request, reason):

    def _get_token(self, request):


    def process_request(self, request):

    def process_view(self, request, callback, callback_args, 

    def process_response(self, request, response):
(5)AuthenticationMiddleware
  • django.contrib.auth.middleware.AuthenticationMiddleware
    • 认证中间件负责处理用户身份认证相关的任务
    • 例如将认证信息关联到请求对象上,为每个请求提供一个user对象,以便在请求处理过程中轻松地获取和使用用户身份信息。
(6)MessageMiddleware
  • django.contrib.messages.middleware.MessageMiddleware
    • 消息中间件用于在请求处理过程中存储和传递临时的、一次性的用户消息。
    • 它允许在HTTP重定向之间跨请求传递消息,例如成功或错误提示,以改善用户体验。
(7)XFrameOptionsMiddleware
  • django.middleware.clickjacking.XFrameOptionsMiddleware
    • 点击劫持中间件用于防止页面被嵌入到其他网站中,从而提供一定的点击劫持保护。
    • 它通过设置X-Frame-Options HTTP头部来限制页面的显示方式,从而防止恶意网页通过iframe等方式嵌入当前网页。

【三】自定义中间件

  • 中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

    • process_request(self,request)

    • process_view(self, request, view_func, view_args, view_kwargs)

    • process_template_response(self,request,response)

    • process_exception(self, request, exception)
    • process_response(self, request, response)
  • 以上方法的返回值可以是None或一个HttpResponse对象

    • 如果是None,则继续按照django定义的规则向后继续执行
    • 如果是HttpResponse对象,则直接将该对象返回给用户。

Django框架之中间件_第1张图片

Django框架之中间件_第2张图片

【1】中间件的执行顺序

【2】必须掌握的中间件方法

(1)process_request:

(1)执行顺序

  • 请求来的时候需要经过每一个中间件的 process_request 方法
  • 结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的

(2)没有定义process_request

  • 如果没有定义这个方法,就跳过这个中间件

(3)定义了返回值

  • 如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)

(4)总结

  • process_request 方法就是用来 做全局相关的所有限制功能
  • 该方法在每个请求到达视图之前被调用,可以对请求进行预处理。
    • 例如,进行身份验证、访问控制或请求日志记录等操作。
  • 它接收一个HttpRequest对象作为参数,并且没有返回值。
(2)process_response:
  • 响应被返回的时候需要结束每一个中间件里面的 process_response 方法

    • 该方法有两个额外的参数
      • request
      • response
  • 该方法必须返回 HttpResponse 对象

    • 默认是response
    • 支持自定义
  • 顺序是按照配置文件中注册过的中间件从下往上依次经过

    • 如果没有定义,则跳过,校验下一个
  • 该方法在每个请求结束并且响应返回到客户端之前被调用。
    • 可以在此处对响应进行处理
    • 例如添加额外的头信息、修改响应内容等。
  • 它接收一个HttpRequest对象和HttpResponse对象作为参数,并且必须返回一个HttpResponse对象。
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse


# from django.middleware.security import SecurityMiddleware
class MyMiddleware1(MiddlewareMixin):

    def process_request(self, request):
        # print(f"这是MyMiddleware1中间件中 process_request 方法 ")
        # if request.META.get('REMOTE_ADDR') == '127.0.0.1':
        #     return HttpResponse(f"当前是 {request.META.get('REMOTE_ADDR')} 已经进入黑名单!")
        # return HttpResponse("这是MyMiddleware1中间件中 process_request 方法 直接返回")
        pass

    def process_response(self, request, response):
        print('这是MyMiddleware1中间件中 process_response 方法')
        response.set_cookie('key', 'user')
        return response


class MyMiddleware2(MiddlewareMixin):

    def process_request(self, request):
        print(f"这是MyMiddleware2中间件中 process_request 方法 ")
        return HttpResponse("这是MyMiddleware2中间件中 process_request 方法 直接返回")

    def process_response(self, request, response):
        print('这是MyMiddleware2中间件中 process_response 方法')
        return response

你可能感兴趣的:(django,中间件,python)