zoukankan      html  css  js  c++  java
  • django 中间件操作

    什么是中间件?
    中间件是一个类.用来处理Django的请求和响应的框架级别的钩子
    中间件的定义方法
    五个方法:(process_request,process_reponse)
    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)
    用法:
    1,引入from django.utils.deprecation import MiddlewareMixin
    2,定义类,并继承MiddlewareMixin
    class MD1(MiddlewareMixin):
    函数
    3,在setting中进行注册
    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',
        'app01.my_middlewares.MD2', 
        'app01.my_middlewares.MD1',
    ]
     
    1,processs_request:
    1,执行时间:
    在视图之前执行
    2,参数:
    request 和视图中的request是同一个
    3,返回值:
    返回None 默认 也是常用
    返回reponse对象
    不执行后面中间的process_request方法和视图
    直接执行当前中间件的process_response方法
    4,执行顺序
    按照注册的顺序执行
    2,process_response
    1,执行时间:
    在视图函数执行之后
    2,request,response
    request和视图中的request是同一个
    response返回的response对象
    3,返回值
    返回response对象 必须要写
    4,执行顺序:
    按照注册顺序倒序
    3,process_view
    1,执行时间;
    在视图函数之前 process_request
    2,参数:
    view_func 将要执行的视图含函数
    view_args 视图函数的可变长位置的参数
    view_kwargs 视图函数的可变长关键参数
    3,返回值
    返回None
    返回response 不执行后面的process_view和视图
    直接执行所有中间件的process_reponse方法
    4,执行顺序
    按照注册顺序执行
    4,processs_exception(触发条件:有错误)
    1,执行时间
    在视图函数之后,process_response之前执行
    2,参数:
    exception 错误对象
    3,返回值:
    返回: None 不对错误进行处理 交给下一个中间件处理 如果没有交给django
    返回 response 对象 下一个中间的process_exception不执行,直接执行所有中间件pricess_response
    4,执行顺序:
    按照注册的倒序执行
    5,process_template_response(条件触发:视图返回的response有render方法)
    1,执行时间
    在视图函数之后,process_response之前执行
    2,参数:response
    3,返回值
    返回response对象
    4,执行顺序:
    按照注册的倒序执行,执行完所有的process_template_response方法后执行
    请求到达中间件之后,先按照正序执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法,将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。
     
    process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。
    process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。总结所有的执行流程如下:
     
     
     
    流程图
     

  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/lnrick/p/9692945.html
Copyright © 2011-2022 走看看