zoukankan      html  css  js  c++  java
  • Django 中间件

    建立中间件需要导入的类:
    from django.utils.deprecation import MiddlewareMixin

    建立成功后:
    在settings.py的MIDDLEWARE配置项中注册建立的自定义中间件:

    Django调用 注册的中间件里面五个方法的顺序:
    1. process_request
    urls.py
    2. process_view
    view
    3. 有异常就执行 process_exception
    4. 如果视图函数返回的响应对象有render方法,就执行process_template_response
    5. 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)

    process_request(self,request)
    request:浏览器发来的请求
    process_request有一个参数,就是request,
    这个request和视图函数中的request是一样的。
    它的返回值可以是None也可以是HttpResponse对象。
    返回值是None的话,按正常流程继续走,交给下一个中间件处理,
    如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。

    1. 何时执行
    在urls.py之前执行
    2. 执行的顺序
    按照在列表中注册的顺序依次执行
    3. 返回值
    1. 返回None, 不错任何处理直接进行下一步
    2. 返回响应对象, 直接跳出(后续中间件的process_request、不执行urls.py和views.py)返回响应

    例:
    def process_request(self,request):
    print('在视图执行前运行的process_request中间件')

    总结:
    1.中间件的process_request方法是在执行视图函数之前执行的.
    2.当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的。
    3.不同中间件之间传递的request都是同一个对象

    process_response(self, request, response)
    request:浏览器发来的请求
    response:服务器返回的响应

    process_response(self, request, response)
    它有两个参数,一个是request,一个是response,
    request就是对象,response是视图函数返回的HttpResponse对象。
    该方法的返回值也必须是HttpResponse对象。

    1. 何时执行
    在views.py返回响应对象之后执行
    2. 执行的顺序
    按照在列表中注册的倒序依次执行
    3. 返回值
    必须要有返回值,返回要是 响应对象

    例:
    def process_response(self, request, response)
    print('在视图执行后运行的process_response中间件,且必须有返回值')
    return response

    process_view(self, request, view_func, view_args, view_kwargs)
    request:浏览器发来的请求
    view_func:将要执行的视图函数的名字
    view_args:将要执行的视图函数的位置参数
    view_kwargs:将要执行的视图函数的关键字参数

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

    1. 执行时间:
    在urls.py之后且执行真正的视图函数之前取执行
    2. 执行顺序
    1. 按照在列表中注册的顺序依次执行
    3. 返回值
    1. 返回None, 放行
    2. 返回响应对象,就直接跳出,倒序依次执行所有中间件的

    例:
    def process_view(self, request, view_func, view_args, view_kwargs):
    print('在urls.py之后且执行真正的视图函数之前去执行')

    process_exception(self, request, exception)
    request:浏览器发来的请求
    exception:视图函数异常产生的Exception对象

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

    1.执行顺序:
    按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
    2.何时执行:
    视图函数中抛出异常的时候才执行
    3.返回值:
    返回None,继续执行后续中间件的process_exception
    返回response,

    例:
    def process_exception(self, request, exception):
    print('在视图函数中抛出异常的时候才去执行')

    process_template_response(self, request, response)
    request:浏览器发来的请求
    response:服务器返回的响应

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

    执行顺序:
    按照注册顺序的倒序(在settings.py里面设置中 从下到上的顺序)
    何时执行:
    视图函数执行完,在执行视图函数返回的响应对象的render方法之前
    返回值:
    返回None,继续执行后续中间件的process_exception
    返回response,

    例:
    def process_template_response(self, request, response):
    print('视图函数执行完,在执行视图函数返回的响应对象的render方法之前')


















  • 相关阅读:
    Spring MVC系列-(5) AOP
    Spring MVC系列-(4) Bean的生命周期
    Spring MVC系列-(3) Bean的装配
    Spring MVC系列-(2) Bean的装配
    Spring MVC系列-(1) Spring概述
    JVM性能优化系列-(7) 深入了解性能优化
    JVM性能优化系列-(6) 晚期编译优化
    pycharm下载较快地址
    编程学习记录14:Oracle数据库序列,触发器
    编程学习记录13:Oracle数据库,表的查询
  • 原文地址:https://www.cnblogs.com/yangli0504/p/9229701.html
Copyright © 2011-2022 走看看