所谓拦截器或decorator的简单理解

A middleware factory is a callable that takes a get_response callable and returns a middleware. A middleware is a callable that takes a request and returns a response, just like a view.

A middleware can be written as a function that looks like this:

def simple_middleware(get_response):
    # One-time configuration and initialization.

    def middleware(request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

    return middleware

关键:

(1)decorator接收的参数,是一个callable函数,我们称为参数函数

     其实,次参数函数,也是被decorator修饰的对象。  

  (2) decorator内部再定义一个函数,调用参数函数

换句话说,decorator谁,就把谁纳入自己的callable参数,在自己内部调用callable参数

 

调用次序

 

每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回None,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。
中间件不用继承自任何类(可以继承 object ),下面一个中间件大概的样子
 

系统默认中间件

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',
]

django 的view 接受请求(request),返回相应(response),这些

你可以把它想象成一个洋葱:每个中间件类都是一个包裹视图view的“层”,它位于洋葱的核心。 如果请求通过洋葱的所有层(每个层都调用 get_response 将请求传递到下一层),那么一直到核心的视图,响应将通过每一层(以相反的顺序)往外退出。

如果其中一个层决定短路并返回response,则该层(包括视图)内的洋葱层都不会看到请求或响应。 响应将仅通过请求传入的相同层返回,如果各层返回None,则继续调用其 get_response ,

 




posted @ 2020-01-03 09:07  花生与酒  阅读(245)  评论(0编辑  收藏  举报