所谓拦截器或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
,