默认中间件

在配置文件settings.py中,有一些默认中间件,如下:
image.png
Django支持自定义中间件。中间件的执行顺序和在列表MIDDLEWARE中的顺序一样。

中间件的执行流程

image.png
如果process_request的返回值为None,继续下一个process_request,否则直接从本级process_response返回。

中间件源码剖析

image.png
要看到源码,得把模块语法写成 from xxx import xxx,然后发现djagno中间件的源码格式类似:均有process_requestprocess_response 方法。

process_request

image.pngimage.png

process_response

response默认是视图的传递过来的responseresponse.content代码返回的信息(字节类型)。
一般这个process_response用的少。

  1. '''IP检测'''
  2. from django.utils.deprecation import MiddlewareMixin
  3. from django.shortcuts import HttpResponse
  4. class IpCheck(MiddlewareMixin):
  5. def process_request(self, request):
  6. '''
  7. :param request: 请求信息对象
  8. :return: 默认返回None,当返回一个响应体的时候,实现了拦截,原路返回
  9. '''
  10. print("IpCheck process_request")
  11. # 非法IP识别
  12. visit_ip = request.META.get("REMOTE_ADDR")
  13. if visit_ip in ['127.0.0.1']:
  14. return HttpResponse("<h1>非法IP!</h1>")
  15. return None
  16. def process_response(self, request, response):
  17. '''
  18. :param request: 请求信息对象
  19. :param response: 视图函数返回的响应体
  20. :return:
  21. '''
  22. print("IpCheck process_response")
  23. print("IpCheck response:", response)
  24. return response

中间件应用

常用于客户端拦截、限制,如:

  • 限速
  • IP黑白名单