• django 中间件


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

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

    中间件可以定义5个方法:分别是

    1  process_request(self,request)

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

    3  process_template_response(self,request,response)

    4  process_exception(self, request, exception)

    5  process_response(self, request, response)

    以上的方法返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则

    继续向后执行,如果是HttpResponse对象,则直接将该对象返回给用户

    自定义一个中间件:

    from django.utils.deprecation import MiddlewareMixin

    class MD1(MiddlewareMixin):

      def process_request(self,request):

        print('你真帅')

    插入到settings里面就可以了,在列表里插件是顺序执行的,响应时是倒叙执行

    process_request方法是在执行试图函数之前执行的

    process_response:

    它有两个参数,一个是request,一个是respone,response就是视图函数返回给的HttpResponse

    对象。该方法的返回值也必须是HttpResponse对象。

    它在视图函数之后执行,而且在setting列表里是倒叙执行的

    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)。

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

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

    process_exception:

    如果试图函数中无异常,process_exception方法不执行。

     print("MD1 中的process_exception")

    如果有异常的话,process_exception会捕捉这个异常:

     def process_exception(self, request, exception)

       print(exception)

      print("MD1 中的process_exception")

      return HttpResponse(str(exception))

    process_template_response(用的比较少)

    process_template_response(self, request, response)

    它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。

    process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

    def process_template_response(self, request, response):

     print("MD1 中的process_template_response")

           return response

    执行顺序:

    先是process_request(),然后process_view(),如果这是有相应对象会直接去到process_response(),执行所有的列表(倒叙)

  • 相关阅读:
    JS的toFixed方法设置小数点位数后再进行计算,数据出错问题
    表单input项使用label,同时引用Bootstrap库,导致input点击效果区增大
    表单多文件上传样式美化 && 支持选中文件后删除相关项
    Fiddler使用AutoResponder进行本地文件和线上文件的映射
    ES6笔记(7)-- Promise异步编程
    ES6笔记(6)-- Set、Map结构和Iterator迭代器
    ES6笔记(5)-- Generator生成器函数
    ES6笔记(4)-- Symbol类型
    ES6笔记(3)-- 解构赋值
    ES6笔记(2)-- let的块级作用域
  • 原文地址:https://www.cnblogs.com/zhaoweihang/p/9230263.html
Copyright © 2020-2023  润新知