Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

什么是中间件

中间件就是在目标结果之间进行的额外处理过程,在Django中就是request和response之间进行的处理,相对来说实现起来比较简单,但是要注意它是对全局有效的,可以在全局范围内改变输入和输出结果,因此需要谨慎使用,否则不仅会造成难以定位的错误,而且可能会影响整体性能。

中间件有什么用?

如果想要修改HttpRequest或者HttpResponse,就可以通过中间件来实现。

  • 登陆认证:在中间件中加入登陆认证,所有请求就自动拥有登陆认证,如果需要放开部分路由,只需要特殊处理就可以了。

  • 流量统计:可以针对一些渲染页面统计访问流量。

  • 恶意请求拦截:统计IP请求次数,可以进行频次限制或者封禁IP。

在Django中自定义中间件:在settings.py中找到MIDDLEWARE项,把添加的中间件配置到这里就行了。

例如我在myapp文件夹下(该文件夹与Django文件夹同级)有一个views.py文件,在views.py中有一个叫做MyMiddleware的中间件,那么配置的时候只要在MIDDLEWARE列表中添加一条:

1
'myapp.views.MyMiddleware'

每个中间件可以包含五个方法:

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

执行流程:

  • 请求到达中间件后先依次执行每个中间件的process_request函数
  • 然后再依次执行每个中间件的process_view函数,找到我们的视图函数
  • 执行视图函数处理请求数据
  • 如果在上面的过程中出现异常,则依次反方向执行每个中间件的process_exception函数
  • 如果请求包含模板渲染,则依次反方向执行每个中间件的process_template_response函数
  • 最后依次反方向执行每个中间件的process_response函数

以上这些执行函数将返回None或者HttpResponse对象,如果返回None,则交给下一个中间件的对应函数处理;如果返回HttpResponse对象,则将其返回给用户。

应用:

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print('过滤中间件')
pass

def process_view(self, request, view_func, view_args, view_kwargs):
pass

def process_exception(self, request, exception):
pass
def process_response(self, request, response):
return response

每次请求时,都会打印一行”过滤中间件”。

评论



愿火焰指引你