首页 > 其他分享 >django中间件

django中间件

时间:2024-10-16 22:47:38浏览次数:1  
标签:process 中间件 self request django response view

  • 什么是中间件

    是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

    Middleware is a framework of hooks into Django’s request/response processing.
    It’s a light, low-level “plugin” system for globally altering Django’s input or output.

  • Django内置中间件

    1. django.middleware.security.SecurityMiddleware

      做了一些安全处理的中间件。比如设置XSS防御的请求头,比如做了http协议转为https协议的工作等。

    2. django.contrib.sessions.middleware.SessionMiddleware

      session中间件。会给request添加一个处理好的session对象。

    3. django.middleware.common.CommonMiddleware

      通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理成/blog/111/自动加上反斜杠。

    4. django.middleware.csrf.CsrfViewMiddleware

      保护中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。SessionMiddleware必须出现在CsrfMiddleware之前。

    5. django.contrib.auth.middleware.AuthenticationMiddleware

      用户授权中间件。会给request添加一个user对象的中间件。该中间件必须在sessionmiddleware后面。

    6. django.contrib.messages.middleware.MessageMiddleware

      消息处理中间件。为了在多个模板中可以使用我们返回给模板的变量,并且简化操作。

    7. django.middleware.clickjacking.XFrameOptionsMiddleware

      防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。

    • 请求进来是自上而下,通过反射找到类,用for循环来执行,可以自定义中间件,但是也要写在MIDDLEWARE中,可以在app下创建一个mymid.py文件来写我们自定义的中间件
    • 每一个中间件都有具体的功能
      在这里插入图片描述
  • 自定义中间件(process_request、process_response)

    中间件可以定义五个方法,分别是:(主要的是process_request和process_response),在自己定义中间件时,必须继承MiddlewareMixin

    process_request(self,request)
    process_view(self, request, callback, callback_args, callback_kwargs)
    process_template_response(self,request,response)
    process_exception(self, request, exception)
    process_response(self, request, response)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户,Django的生命周期图示很明显

    • 第一步:导入
      from django.utils.deprecation import MiddlewareMixin
      
      • 1
    • 第二步:自定义中间件
      from django.utils.deprecation import MiddlewareMixin
      from django.shortcuts import HttpResponse
      

      class Md1(MiddlewareMixin):
      def process_request(self, request):
      print("M1请求来时,效验")

      def process_response(self, request, response):
          print("M1返回数据时,对数据处理处理")
          return response
      

      class Md2(MiddlewareMixin):
      def process_request(self, request):
      print("M2效验")
      # return HttpResponse("Md2中断")

      def process_response(self, request, response):
          print("M2返回")
          return response
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    • 第三步:在view中定义一个视图函数(index)
      def index(request):
          print("view函数...")
          return HttpResponse("OK")
      
      • 1
      • 2
      • 3
    • 第四步:在settings.py的MIDDLEWARE里注册自己定义的中间件
      在这里插入图片描述
    • 运行结果
      在这里插入图片描述
    • process_request与process_response调用顺序
      • 中间件的process_request方法是在执行视图函数之前执行的;当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
      • 多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的
  • process_view

    Django会在调用视图函数之前调用process_view方法。

    • 表达式:process_view(self, request, view_func, view_args, view_kwargs)
      • request是HttpRequest对象。
      • view_func是Django即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)。
      • view_args是将传递给视图的位置参数的列表(无名分组分过来的值)
      • view_kwargs是将传递给视图的关键字参数的字典(有名分组分过来的值)。view_args和view_kwargs都不包含第一个视图参数(request)。

    它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

    在这里插入图片描述

  • process_exception

    这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

    • 表达式:process_exception(self, request, exception)
      • request:HttpRequest对象
      • exception:视图函数异常产生的Exception对象。
        在这里插入图片描述
  • process_template_response

    该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法

    from django.http import HttpResponse
    from django.shortcuts import render
    

    Create your views here.

    class Test:
    def init(self, status, msg):
    self.status = status
    self.msg = msg

    def render(self):
        import json
        dic = {'status': self.status, 'msg': self.msg}
    
        return HttpResponse(json.dumps(dic))
    

    def index(request):
    print("view函数...")
    return Test(True, '测试')

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

标签:process,中间件,self,request,django,response,view
From: https://www.cnblogs.com/clark1990/p/18471078

相关文章