±à¼ÍƼö: |
ÎÄÕÂÖ÷Òª½²ÊöÖмä¼þµÄ¸ÅÄî
×Ô¶¨ÒåÖмä¼þ
Öмä¼þÓ¦Óó¡¾°£¬Ï£Íû¶Ô´ó¼ÒÓаïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þç÷ç÷±à¼£¬ÍƼö¡£ |
|
Öмä¼þµÄ¸ÅÄî
Öмä¼þ¹ËÃû˼Ò壬ÊǽéÓÚrequestÓëresponse´¦ÀíÖ®¼äµÄÒ»µÀ´¦Àí¹ý³Ì£¬Ïà¶Ô±È½ÏÇáÁ¿¼¶£¬²¢ÇÒÔÚÈ«¾ÖÉϸıädjangoµÄÊäÈëÓëÊä³ö¡£ÒòΪ¸Ä±äµÄÊÇÈ«¾Ö£¬ËùÒÔÐèÒª½÷É÷ʵÓã¬Óò»ºÃ»áÓ°Ïìµ½ÐÔÄÜ¡£
DjangoµÄÖмä¼þµÄ¶¨Ò壺
Middleware is
a framework of hooks into Django¡¯s request/response
processing. It¡¯s a light, low-level ¡°plugin¡± system
for globally altering Django¡¯s input or output. |
Èç¹ûÄãÏëÐÞ¸ÄÇëÇó£¬ÀýÈç±»´«Ë͵½viewÖеÄHttpRequest¶ÔÏó¡£ »òÕßÄãÏëÐÞ¸Äview·µ»ØµÄHttpResponse¶ÔÏó£¬ÕâЩ¶¼¿ÉÒÔͨ¹ýÖмä¼þÀ´ÊµÏÖ¡£
¿ÉÄÜÄ㻹ÏëÔÚviewÖ´ÐÐ֮ǰ×öһЩ²Ù×÷£¬ÕâÖÖÇé¿ö¾Í¿ÉÒÔÓà middlewareÀ´ÊµÏÖ¡£
DjangoĬÈϵÄMiddleware£º
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',
] |
ÿһ¸öÖмä¼þ¶¼ÓÐ×Ô¼º¾ßÌåµÄ¹¦ÄÜ¡£
×Ô¶¨ÒåÖмä¼þ
Öмä¼þÖпÉÒÔ¶¨Òå5¸ö·½·¨£¬·Ö±ðÊÇ£º
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response
1¡¢process_request£¬process_response
µ±Óû§·¢ÆðÇëÇóµÄʱºò»áÒÀ´Î¾¹ýËùÓеĵÄÖмä¼þ£¬Õâ¸öʱºòµÄÇëÇóʱprocess_request,×îºóµ½´ïviewsµÄº¯ÊýÖУ¬viewsº¯Êý´¦Àíºó£¬ÔÚÒÀ´Î´©¹ýÖмä¼þ£¬Õâ¸öʱºòÊÇprocess_response,×îºó·µ»Ø¸øÇëÇóÕß¡£

ÉÏÊö½ØÍ¼ÖеÄÖмä¼þ¶¼ÊÇdjangoÖеģ¬ÎÒÃÇÒ²¿ÉÒÔ×Ô¼º¶¨ÒåÒ»¸öÖмä¼þ£¬ÎÒÃÇ¿ÉÒÔ×Ô¼ºÐ´Ò»¸öÀ࣬µ«ÊDZØÐë¼Ì³ÐMiddlewareMixin
ÐèÒªµ¼Èë
from django.utils.deprecation
import MiddlewareMixin |

in views:
def index(request):
print("viewº¯Êý...")
return HttpResponse("OK") |
in Mymiddlewares.py£º
from django.utils.deprecation
import MiddlewareMixin
from django.shortcuts import HttpResponse
class Md1(MiddlewareMixin):
def process_request(self,request):
print("Md1ÇëÇó")
def process_response(self,request,response):
print("Md1·µ»Ø")
return response
class Md2(MiddlewareMixin):
def process_request(self,request):
print("Md2ÇëÇó")
#return HttpResponse("Md2ÖжÏ")
def process_response(self,request,response):
print("Md2·µ»Ø")
return response |
Êä³ö£º
Md1ÇëÇó
Md2ÇëÇó
viewº¯Êý...
Md2·µ»Ø
Md1·µ»Ø |
×¢Ò⣺Èç¹ûµ±ÇëÇóµ½´ïÇëÇó2µÄʱºòÖ±½Ó²»·ûºÏÌõ¼þ·µ»Ø£¬¼´return HttpResponse("Md2ÖжÏ")£¬³ÌÐò½«°ÑÇëÇóÖ±½Ó·¢¸øÖмä¼þ2·µ»Ø£¬È»ºóÒÀ´Î·µ»Øµ½ÇëÇóÕߣ¬½á¹ûÈçÏ£º
·µ»ØMd2ÖжϵÄÒ³Ãæ£¬ºǫ́´òÓ¡ÈçÏ£º
Md1ÇëÇó
Md2ÇëÇó
Md2·µ»Ø
Md1·µ»Ø |

2¡¢process_view
process_view£¨self, request, callback, callback_args, callback_kwargs£©·½·¨½éÉÜ
(1)Ö´ÐÐÍêËùÓÐÖмä¼þµÄrequest·½·¨
(2)urlÆ¥Åä³É¹¦
(3)Äõ½ ÊÓͼº¯ÊýµÄÃû³Æ¡¢²ÎÊý£¬£¨×¢Òâ²»Ö´ÐУ© ÔÙÖ´ÐÐprocess_view()·½·¨
(4)×îºóÈ¥Ö´ÐÐÊÓͼº¯Êý
·½·¨Ò»¡¢
from django.utils.deprecation
import MiddlewareMixin
from django.shortcuts import HttpResponse
class Md1(MiddlewareMixin):
def process_request(self,request):
print("Md1ÇëÇó")
#return HttpResponse("Md1ÖжÏ")
def process_response(self,request,response):
print("Md1·µ»Ø")
return response
def process_view(self, request, callback,
callback_args, callback_kwargs):
print("Md1view")
class Md2(MiddlewareMixin):
def process_request(self,request):
print("Md2ÇëÇó")
return HttpResponse("Md2ÖжÏ")
def process_response(self,request,response):
print("Md2·µ»Ø")
return response
def process_view(self, request, callback,
callback_args, callback_kwargs):
print("Md2view") |
Êä³ö£º
Md1ÇëÇó
Md2ÇëÇó
Md1view
Md2view
viewº¯Êý...
Md2·µ»Ø
Md1·µ»Ø |
¹ý³Ì·ÖÎö

µ±×îºóÒ»¸öÖмäµÄprocess_requestµ½´ï·ÓɹØÏµÓ³ÉäÖ®ºó£¬·µ»Øµ½Öмä¼þ1µÄprocess_view£¬È»ºóÒÀ´ÎÍùÏ£¬µ½´ïviewsº¯Êý£¬×îºóͨ¹ýprocess_responseÒÀ´Î·µ»Øµ½´ïÓû§¡£
process_view¿ÉÒÔÓÃÀ´µ÷ÓÃÊÓͼº¯Êý£º
class Md1(MiddlewareMixin):
def process_request(self,request):
print("Md1ÇëÇó")
#return HttpResponse("Md1ÖжÏ")
def process_response(self,request,response):
print("Md1·µ»Ø")
return response
def process_view(self, request, callback, callback_args,
callback_kwargs):
# return HttpResponse("hello")
response=callback(request, *callback_args,**callback_kwargs)
return response |
Êä³ö:
Md1ÇëÇó
Md2ÇëÇó
viewº¯Êý...
Md2·µ»Ø
Md1·µ»Ø |
×¢Ò⣺process_viewÈç¹ûÓзµ»ØÖµ£¬»áÔ½¹ýÆäËûµÄprocess_viewÒÔ¼°ÊÓͼº¯Êý£¬µ«ÊÇËùÓеÄprocess_response¶¼»¹»áÖ´ÐС£
3¡¢process_exception
process_exception(self, request, exception)·½·¨
M1.request
M2.request
M1.process_view
M2.process_view
Ö´ÐÐindex
M2µÄprocess_exception
M1µÄprocess_exception
Internal Server Error: /index/
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local \Programs\Python\Python36\lib\site-packages \django\core\handlers\exception.py",
line 41, in inner
response = get_response(request)
File "C:\Users\Administrator\AppData \Local\Programs\Python\Python36\lib \site-packages\django\core\handlers \base.py",
line 187, in _get_response
response = self.process_exception_ by_middleware(e,
request)
File "C:\Users\Administrator\AppData\Local \Programs\Python\Python36\lib\site-packages \django\core\handlers\base.py",
line 185, in _get_response
response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "F:\untitled1\app01\views.py",
line 7, in index
int("ok")
ValueError: invalid literal for int() with base
10: 'ok'
M2.response
M1.response
[03/Jul/2017 16:43:59] "GET /index / HTTP/1.1"
500 62663 |
1¡¢Ö´ÐÐÍêËùÓÐ request ·½·¨
2¡¢Ö´ÐÐ ËùÓÐ process_view·½·¨
3¡¢Èç¹ûÊÓͼº¯Êý³ö´í£¬Ö´ÐÐprocess_exception£¨×îÖÕresponse£¬process_exceptionµÄreturnÖµ£©
Èç¹ûprocess_exception ·½·¨ÓÐÁË ·µ»ØÖµ ¾Í²»ÔÙÖ´ÐÐ ÆäËûÖмä¼þµÄ process_exception£¬Ö±½ÓÖ´ÐÐresponse·½·¨ÏìÓ¦
4.Ö´ÐÐËùÓÐresponse·½·¨
5.×îºó·µ»Øprocess_exceptionµÄ·µ»ØÖµ
Êä³ö£º
M1.request
M2.request
M1.process_view
M2.process_view
Ö´ÐÐindex
M2µÄprocess_exception £¨ÓÐÁËreturnÖµ£¬Ö±½ÓÖ´ÐÐresponse£©
M2.response
M1.response |
process_exceptionµÄÓ¦ÓÃ
ÔÚÊÓͼº¯ÊýÖ´Ðгö´íʱ£¬·µ»Ø´íÎóÐÅÏ¢¡£ÕâÑùÒ³Ãæ¾Í²»»á ±¨´íÁË£¡
class M1(MiddlewareMixin):
def process_request(self, request):
print('M1.request')
def process_view(self, request, callback,callback_args,callback_kwargs
):
print("M1.process_view")
def process_response(self, request, response):
print('M1.response')
return response
def process_exception(self, request,exception):
print('M1µÄprocess_exception')
class M2(MiddlewareMixin):
def process_request(self, request):
print('M2.request')
def process_view(self, request, callback,callback_args,callback_kwargs
):
print("M2.process_view")
def process_response(self, request, response):
print('M2.response')
return response
def process_exception(self, request, exception):
print('M2µÄprocess_exception')
return HttpResponse('³ö´íÁËÐֵܣ¡£¡£¡') |
Á÷³ÌͼÈçÏ£º
µ±views³öÏÖ´íÎóʱ£º

4¡¢process_template_response()
from django.utils.deprecation
import MiddlewareMixin
from django.shortcuts import HttpResponse
class M1(MiddlewareMixin):
def process_request(self, request):
print('M1.request')
def process_view(self, request, callback,callback_args,callback_kwargs
):
print("M1.process_view")
def process_response(self, request, response):
print('M1.response')
return response
def process_exception(self, request,exception):
print('M1µÄprocess_exception')
class M2(MiddlewareMixin):
def process_request(self, request):
print('M2.request')
def process_view(self, request, callback,callback_args,callback_kwargs
):
print("M2.process_view")
def process_response(self, request, response):
print('M2.response')
return response
def process_exception(self, request, exception):
print('M2µÄprocess_exception')
def process_template_response (self,request,response):
print('M2process_template_response')
return response |
process_template_response()ĬÈϲ»Ö´ÐÐ

rocess_template_response()ÌØÐÔ
Ö»ÓÐÔÚÊÓͼº¯ÊýµÄ·µ»Ø¶ÔÏóÖÐÓÐrender·½·¨²Å»áÖ´ÐУ¡
²¢°Ñ¶ÔÏóµÄrender·½·¨µÄ·µ»ØÖµ·µ»Ø¸øÓû§£¨×¢Òâ²»·µ»ØÊÓͼº¯ÊýµÄreturnµÄ½á¹ûÁË£¬¶øÊÇ·µ»ØÊÓͼº¯Êý returnÖµ£¨¶ÔÏ󣩵Ärender·½·¨£©
from django.utils.deprecation
import MiddlewareMixin
from django.shortcuts import HttpResponse
class M1(MiddlewareMixin):
def process_request(self, request):
print('M1.request')
def process_view(self, request, callback,callback_args,callback_kwargs
):
print("M1.process_view")
def process_response(self, request, response):
print('M1.response')
return response
def process_exception(self, request,exception):
print('M1µÄprocess_exception')
class M2(MiddlewareMixin):
def process_request(self, request):
print('M2.request')
def process_view(self, request, callback,callback_args,callback_kwargs
):
print("M2.process_view")
def process_response (self, request, response):
print('M2.response')
return response
def process_exception (self, request, exception):
print('M2µÄprocess_exception')
def process_template_response (self,request,response):
#Èç¹ûÊÓͼº¯ÊýÖеķµ»ØÖµ ÖÐÓÐrender·½·¨£¬ ²Å»áÖ´ÐÐ process_template_response
print('M2process_template_response')
return response |
ÊÓͼº¯Êý
from django.shortcuts
import render,HttpResponse
# Create your views here.
class Foo():
def __init__(self,requ):
self.req=requ
def render(self):
return HttpResponse('OKKKK')
def index(request):
print("Ö´ÐÐindex")
obj=Foo(request)
return obj |
Ö´Ðнá¹û

Ó¦Óãº
¼ÈÈ»process_template_respnse,²»·µ»ØÊÓͼº¯ÊýµÄreturnµÄ½á¹û£¬¶øÊÇ·µ»ØÊÓͼº¯Êý returnÖµ£¨¶ÔÏ󣩵Ärender·½·¨;(¶à¼ÓÁËÒ»¸ö»·½Ú)
¾Í¿ÉÒÔÔÚ Õâ¸öÊÓͼº¯Êý·µ»Ø¶ÔÏóµÄ render·½·¨À×ö·µ»ØÖµµÄ¶þ´Î¼Ó¹¤ÁË£¡¶à¼Ó¹¤¼¸¸ö£¬ÊÓͼº¯Êý¾Í¿ÉÒÔËæ±ãʹÓÃÁË£¡
£¨ºÃ±È ÅçÎíÆ÷ÓÐÁ˶à¸öÅçÍ·£¬»»²»Í¬µÄÅçÍ·Åç³ö²»Í¬Ë®£¬·µ»ØÖµ¾Í¿ÉÒÔÒ²×é¼þ»¯ÁË£©
from django.shortcuts
import render,
HttpResponse
# Create your views here.
class Dict(): #¶ÔÊÓͼº¯Êý·µ»ØÖµ×ö¶þ´Î·â×° £¡£¡
def __init__(self,requ,msg):
self.req=requ
self.msg=msg
def render(self):
a=self.msg #ÔÚrender·½·¨ÀïÃæ °ÑÊÓͼº¯ÊýµÄ ·µ»ØÖµ ÖÆ×÷³É×Öµä ¡¢ÁбíµÈ¡£¡£¡£
# Èç¹ûÐÂÔöÁËÆäËû Ò»¸öÊÓͼº¯ÊýÖ±½Ó£¬ return¶ÔÏó ¼´¿É£¡²»ÓÃÿ¸öÊÓͼº¯Êý¶¼Ð´ ÖÆ×÷×Öµä
ÁÐ±í Æ´½ÓµÄÂß¼ÁË
return HttpResponse(a) #
def index(request):
print("Ö´ÐÐindex")
obj=Dict(request,"vv")
return obj |
Öмä¼þÓ¦Óó¡¾°
ÓÉÓÚÖмä¼þ¹¤×÷ÔÚ ÊÓͼº¯ÊýÖ´ÐÐǰ¡¢Ö´Ðкó£¨Ïñ²»ÏñËùÓÐÊÓͼº¯ÊýµÄ×°ÊÎÆ÷£¡£©ÊʺÏËùÓеÄÇëÇó/Ò»²¿·ÖÇëÇó×öÅúÁ¿´¦Àí
1¡¢×öIPÏÞÖÆ
·ÅÔÚ Öмä¼þÀàµÄÁбíÖУ¬×èֹijЩIP·ÃÎÊÁË£»
2¡¢URL·ÃÎʹýÂË
Èç¹ûÓû§·ÃÎʵÄÊÇloginÊÓͼ£¨·Å¹ý£©
Èç¹û·ÃÎÊÆäËûÊÓͼ£¨ÐèÒª¼ì²âÊDz»ÊÇÓÐsessionÒѾÓÐÁË·ÅÐУ¬Ã»Óзµ»Ølogin£©£¬ÕâÑù¾ÍÊ¡µÃÔÚ ¶à¸öÊÓͼº¯ÊýÉÏдװÊÎÆ÷ÁË£¡
3¡¢»º´æ£¨»¹¼ÇµÃCDNÂð?£©
¿Í»§¶ËÇëÇóÀ´ÁË£¬Öмä¼þÈ¥»º´æ¿´¿´ÓÐûÓÐÊý¾Ý£¬ÓÐÖ±½Ó·µ»Ø¸øÓû§£¬Ã»ÓÐÔÙÈ¥Âß¼²ã Ö´ÐÐÊÓͼº¯Êý
|