Django之中间件

Posted 世界辣么大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之中间件相关的知识,希望对你有一定的参考价值。

1、中间件流程

  当启动django程序并发送一个请求后,首先通过WSGI,然后走一遍settings.py中设置的MIDDLEWARE,即中间件:

2、中间件的五个方法:

  1) process_request(request):

    - request是一个HttpRequest对象

    - 在Django决定执行哪个视图之前,process_request()会在每个请求上调用。

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

    - request:一个HttpRequest对象

    - view_func :Django会调用的一个Python函数

    - view_args:会被传递到视图的位置参数列表

    - view_kwargs:会被传递到视图的关键字参数字典

    - process_view()会在Django 调用视图之前被调用。它将返回None 或一个Httpresponse对象。如果返回None,Django 将会继续处理这个请求,执行其它的process_view() 中间件,然后调用对应的视图。如果返回一个Httpresponse对象,Django 就不用再去调用其它的view 或exception 中间件,或对应的视图.

  3)process_exception(request, exception):

    - request:一个HttpRequest对象

    - exception:一个被视图中的方法抛出来的 Exception对象

    - 如果当一个视图抛出异常时,Django会调用process_exception()来处理,而不会执行process_response。process_exception()应该返回一个None 或者一个Httpresponse对象。如果它返回一个Httpresponse对象,模型响应和响应中间件会被应用,响应结果会返回给浏览器。否则, 默认的异常处理机制将会被触发。

  4)process_template_response(request, response):

    - request:一个HttpRequest对象

    - response:一个TemplateResponse对象(或等价的对象),由Django视图或者中间件返回。

    - 如果响应的实例有render()方法,这时候process_template_response()在视图刚好执行完毕之后会被调用。

  5)process_response(request, response):

    - request:一个HttpRequest对象

    - response:Django视图或者中间件返回的HttpResponse或者StreamingHttpResponse对象。

    - 该方法会在所有响应返回浏览器之前被调用,这个方法必须返回Httpresponse或者StreamingHttpResponse对象。它可以改变已有的response,或者创建并返回新的HttpResponse或StreamingHttpResponse对象。

  注意:最后在响应阶段中,中间件以相反的顺序被应用,即在MIDDLEWARE中,最底下的类会最先被运行。

3、自定义中间件

  1)在项目下新建一个文件夹:Middle,在里面建立一个MyMiddle.py文件,写下:

# django1.10 以后的版本需要导入并继承该模块
from django.utils.deprecation import MiddlewareMixin

# 创建一个类,并定义process_request和process_response两个方法
# 其它三个方法可以看情况自行定义
class Row(MiddlewareMixin):
    def process_request(self, request):
        print(\'处理请求\')

    def process_response(self, request, response):
        print(\'处理响应\')
        return response

 

  2)在settings.py中的MIDDLEWARE里加上自己写的类的路径:

以上是关于Django之中间件的主要内容,如果未能解决你的问题,请参考以下文章

Django基础之中间件

Django之权限管理

Django进阶之中间件

django框架之中间件

django之(中间件)middleware

Django之中间件浅析