Django的Middleware中间件
中间件是什么
我们在Django Book中看到一张图很好,在正常的请求和响应阶段,Middleware充当的角色见下图
其实说白了,中间件就是古代皇宫传话,传旨的公公(这里我们假设是宦官专政的朝代,皇帝听什么说什么都通过公公传达).传话(request)
:外界的声音(客户端)想要建言给皇帝(服务器),但是传话的途中先经过公公们,公公们可以为了利益改变内容,好听的传给皇帝,不好听的要么不传或者篡改内容传给皇帝.
这个功能由process_request
和process_view
负责.传旨(response)
:皇帝下旨被公公篡改.
这个功能由process_response
,process_exception
,process_template_response
负责.
传话(request)
举个例子:
我在我的项目中添加一个传话的公公ManWithoutPenisMiddleware
:1
2
3
4
5
6
7
8
9MIDDLEWARE_CLASSES = (
'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',
'ManWithoutPenis.middleware.ManWithoutPenisMiddleware',
)
那这位公公要做什么呢?看下面的这位公公的职责:1
2
3
4class ManWithoutPenisMiddleware(object):
def process_request(self, request):
if request.META['REMOTE_ADDR'] in getattr(settings, "Loyalist", []):
return http.HttpResponseForbidden('<h1>皇帝让你去死!!谢恩吧</h1>')
很明显,这位忠臣因为自己的身份(REMOTE_ADDR)被公公发现在他的黑名单中,于是得到以为是来自皇上的回复<h1>皇帝让进宫做公公!!谢恩吧</h1>
,最后长叹三声:纳尼!纳尼!纳尼!然后挥刀自宫.
这里有一个规则,当process_request
或者process_view
回馈的类型是HttpResponse
,那么request
也就不会在往下面继续传递了,直接返回给客户端内容。
传旨(response)
还是这为公公,这次他负责传旨(嘿嘿嘿):1
2
3
4
5
6
7class ManWithoutPenisMiddleware(object):
def process_request(self, request):
if request.META['REMOTE_ADDR'] in getattr(settings, "Loyalist", []):
return http.HttpResponseForbidden('<h1>皇帝让你去死!!谢恩吧</h1>')
def process_response(self, request, response):
response.write("<p>皇帝让你进宫当公公!谢恩吧</p>")
return response
这里公公又篡改圣旨,又无缘无故让人家切了小鸡鸡!
总结
虽然举的例子是坏公公,但是在真正的Django架构中,Middleware
可是大忠臣的存在.他可以防止坏人的恶意攻击,提升安全性,用会话将用户和请求关联….
总之,这是一个很强大的公公!!