我们在Django Book中看到一张图很好,在正常的请求和响应阶段,Middleware充当的角色见下图
其实说白了,中间件就是古代皇宫传话,传旨的公公(这里我们假设是宦官专政的朝代,皇帝听什么说什么都通过公公传达).
传话(request) :外界的声音(客户端)想要建言给皇帝(服务器),但是传话的途中先经过公公们,公公们可以为了利益改变内容,好听的传给皇帝,不好听的要么不传或者篡改内容传给皇帝.
这个功能由 process_request 和 process_view 负责.
传旨(response) :皇帝下旨被公公篡改.
这个功能由 process_response , process_exception , process_template_response 负责.
传话(request)举个例子:
我在我的项目中添加一个传话的公公 ManWithoutPenisMiddleware :
MIDDLEWARE_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', )
那这位公公要做什么呢?看下面的这位公公的职责:
class 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)还是这为公公,这次他负责传旨(嘿嘿嘿):
class 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 可是大忠臣的存在.他可以防止坏人的恶意攻击,提升安全性,用会话将用户和请求关联….
总之,这是一个很强大的公公!!