作者:bert
链接:https://zhuanlan.zhihu.com/p/25505601
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
中间件是一hooks应用于Django的请求/响应处理框架。 它是一个轻,低级的“插件”系统,用于全局改变Django的输入或输出。
官方文档供给出三种实现方法
第三种是推荐而且比较常用的方法。我们可以把它想象成一个洋葱,每一层都是一个中间件类,这些中间件包裹着views(视图)。当一个请求(request)进入所有层,将request从第一个层依次传递下一个直到view执行,然后响应(response)通过每一层(注意:以相反的顺序)原路返回。
以下是官方的一些中间件,有auth,sesssion以及csrf等,对于我们自定义的中间件来说当然是根据自己项目的需求来做喽,核心在于知道在哪些环节使用那个方法就可以熟练的使用中间件。
‘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‘,
# -*- coding: utf-8 -*-
#方法一:装饰器方法 基于方法
def test1(get_response):
def middleware(request):
print ">>>>>>>>1"
response = get_response(request)
print ">>>>>>>>3"
return response
return middleware
#方法二:装饰器方法 基于对象
class Test2(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print ">>>>>>>>>2"
response = self.get_response(request)
print ">>>>>>>>>3"
return response
#方法三 基于请求/响应中间件模式 这种方式需要在 setting中的MIDDLEWARE_CLASSES增加Test3 相当于激活中间件 常用模式上面两种很少用
class Test3(object):
def process_view(self, request, view_func, view_args, view_kwargs):
print ">>>>>>>>in process_view"
def process_request(self, request):
print ">>>>>>>>in process_requset"
return None
def process_response(self, request, response):
print ">>>>>>>>in process_response"
return response
def process_exception(self, request, exception):
print ">>>>>>>>in process_exception"
def process_template_response(self, request, response):
print ">>>>>>>>in process_template_response"
return response
views/py
@test1
def hello1(request):
print ">>>>>>>view"
c = RequestContext(request, { })
return render_to_response(‘hello/hello.html‘, c)
@Test2
def hello2(request):
print ">>>>>>>view"
c = RequestContext(request, { })
return render_to_response(‘hello/hello.html‘, c)
def hello3(request):
print ">>>>>>>view"
c = RequestContext(request, { })
return render_to_response(‘hello/hello.html‘, c)
原文:https://www.cnblogs.com/fan-1994716/p/11875966.html