文章目录
  1. 1. 中间件是什么
    1. 1.1. 传话(request)
    2. 1.2. 传旨(response)
  2. 2. 总结

中间件是什么

我们在Django Book中看到一张图很好,在正常的请求和响应阶段,Middleware充当的角色见下图

其实说白了,中间件就是古代皇宫传话,传旨的公公(这里我们假设是宦官专政的朝代,皇帝听什么说什么都通过公公传达).

传话(request):外界的声音(客户端)想要建言给皇帝(服务器),但是传话的途中先经过公公们,公公们可以为了利益改变内容,好听的传给皇帝,不好听的要么不传或者篡改内容传给皇帝.
    这个功能由process_requestprocess_view负责.
传旨(response):皇帝下旨被公公篡改.
    这个功能由process_responseprocess_exceptionprocess_template_response负责.

传话(request)

举个例子:
我在我的项目中添加一个传话的公公ManWithoutPenisMiddleware:

1
2
3
4
5
6
7
8
9
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',
)

那这位公公要做什么呢?看下面的这位公公的职责:

1
2
3
4
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)

还是这为公公,这次他负责传旨(嘿嘿嘿):

1
2
3
4
5
6
7
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可是大忠臣的存在.他可以防止坏人的恶意攻击,提升安全性,用会话将用户和请求关联….
总之,这是一个很强大的公公!!

文章目录
  1. 1. 中间件是什么
    1. 1.1. 传话(request)
    2. 1.2. 传旨(response)
  2. 2. 总结