Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

Django的Middleware中间件

$
0
0

我们在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 可是大忠臣的存在.他可以防止坏人的恶意攻击,提升安全性,用会话将用户和请求关联….

总之,这是一个很强大的公公!!


Viewing all articles
Browse latest Browse all 9596

Trending Articles