1. Principle
In Django, the middleware is actually a class, and after the request arrives and ends, Django executes the appropriate method in the middleware at the right time according to its own rules.
When the request arrives, there is a layer of middleware in the middle of the WSGI and URLs, exactly the 4-tier approach and the Django Framework's handling:
Process_request (Self,request)
Process_view (self, request, callback, Callback_args, Callback_kwargs)
Views
process_exception (Self, request, exception)
Process_response (self, request, response)
The names and parameters of these functions cannot be changed, and any link with response will be handed to Process_response () to be processed and returned to the user.
2. Custom MiddlewareCreate a Package
middle1.py
1234567891011121314151617 |
class mmm(
object
):
def process_request(
self
,request):
print "mmm.process_request"
def process_view(
self
,request,callback,callback_args,callback_kwargs):
print "mmm.process_view"
def process_response(
self
,request,response):
print "mmm.process_response"
return response
class xxx(
object
):
def process_request(
self
,request):
print "xxx.process_request"
def process_view(
self
,request,callback,callback_args,callback_kwargs):
print "xxx.process_view"
def process_response(
self
,request,response):
print "xxx.process_response"
return
response
|
settings.py
123456789101112 |
MIDDLEWARE_CLASSES
= [
‘django.middleware.security.SecurityMiddleware‘
,
‘django.contrib.sessions.middleware.SessionMiddleware‘
,
‘django.middleware.common.CommonMiddleware‘
,
# ‘django.middleware.csrf.CsrfViewMiddleware‘,
‘django.contrib.auth.middleware.AuthenticationMiddleware‘
,
‘django.contrib.auth.middleware.SessionAuthenticationMiddleware‘
,
‘django.contrib.messages.middleware.MessageMiddleware‘
,
‘django.middleware.clickjacking.XFrameOptionsMiddleware‘
,
‘middleware.middle1.mmm‘
,
‘middleware.middle1.xxx‘
,
]
|
views.py
123 |
def index(request): print "view" return HttpResponse( "index" ) |
Ide
You can see the order of execution, noting that the order of execution of Process_response () is from backward forward.
3. Source code
123456789101112131415161718192021222324 |
#Django自动去settings里找 MIDDLEWARE_CLASSES
process_request_list
=
[]
process_view_list
=
[]
process_response_list
=
[]
process_exception_list
=
[]
for class in
MIDDLEWARE_CLASSES:
obj
= class
()
if hasattr
(obj,process_request):
process_request_list.append(obj.process_request)
if hasattr
(obj,process_view):
process_view_list.append(obj.process_view)
if hasattr
(obj,process_response):
process_response_list.append(obj.process_response)
if hasattr
(obj,process_exception):
process_exception_list.append(obj.process_exception)
for i
in process_request_list:
i()
for i
in process_view_list:
i()
#Django渲染
for i
in process_exception_list:
i()
for i
in process_response_list:
i()
|
4.process_exceptionviews.py
12 |
def index(request): raise Exception( "报错了" ) |
middleware/middle.py
1234567891011 |
class mmm(
object
):
def process_request(
self
,request):
print "mmm.process_request"
def process_view(
self
,request,callback,callback_args,callback_kwargs):
print "mmm.process_view"
def process_response(
self
,request,response):
print "mmm.process_response"
return
response
def process_exception(
self
, request, exception):
print exception
return request
|
Browser
IDE
Attention:?
From for notes (Wiz)
django--Middleware