Django middleware中间件

待我称王封你为后i 2023-07-10 11:13 77阅读 0赞

1.什么是Django中间件
2.Django中间件的执行逻辑
3.实现自定义中间件

1.什么是DJango中间件
Django中间件是一个类;
请求前后在合适的时机执行相应的方法;
可以通过在settings文件中配置MIDDLEWARE_CLASSES属性来设置使用何种中间件。

  1. MIDDLEWARE = [
  2. # 安全中间件,处理请求应答安全的处理
  3. 'django.middleware.security.SecurityMiddleware',
  4. # 提供由状态服务Session中间件
  5. 'django.contrib.sessions.middleware.SessionMiddleware',
  6. 'django.middleware.common.CommonMiddleware',
  7. # 防止跨站伪造请求的中间件
  8. # 'django.middleware.csrf.CsrfViewMiddleware',
  9. # Django自带的认证体系中间件
  10. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  11. # 消息中间件
  12. 'django.contrib.messages.middleware.MessageMiddleware',
  13. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  14. ]

Gzip压缩中间件,处理网页请求/应答中文件压缩:GzipMiddleware

2.Django中间件执行逻辑
如下图,每个请求都会两次经过配置的中间件,多个中间件之间存在执行顺序。
在这里插入图片描述
3.实现自定义中间件
settings.py

  1. # 项目启动后自动实例化所有中间件
  2. MIDDLEWARE = [
  3. ...
  4. 'ops.middlewaredemo.TestMiddleware',
  5. 'ops.middlewaredemo.Test2Middleware',
  6. ...
  7. ]

ops/middlewaredemo.py

  1. class TestMiddleware:
  2. def __init__(self, get_response):
  3. self.get_response = get_response
  4. print('build TestMiddleware')
  5. def __call__(self, request):
  6. print('TestMiddleware before request.')
  7. response = self.get_reponse(request)
  8. print('TestMiddleware after request.')
  9. return response
  10. class Test2Middleware:
  11. def __init__(self, get_response):
  12. self.get_response = get_response
  13. print('build TestMiddleware')
  14. def __call__(self, request):
  15. print('Test2 before request.')
  16. response = self.get_reponse(request)
  17. print('Test2 after request.')
  18. return response

apis/views/test.py

  1. def helloworld(request):
  2. data = dict()
  3. data['query'] = request.GET.get('info')
  4. # http://127.0.0.1:8000/api/v1.0/service/hello?info=beijing
  5. return JsonResponse(data=data, safe=False, status=200) # {"query": "beijing"}

配置路由后,启动项目访问web helloworld
console:

  1. D:\django_project\backend_ch1_sec1\ops\middlewaredemo.py: __call__: 13 INFO - TestMiddleware before request.
  2. D:\django_project\backend_ch1_sec1\ops\test2middleware.py: __call__: 14 INFO - Test2 before request.
  3. D:\django_project\backend_ch1_sec1\ops\test2middleware.py: __call__: 16 INFO - Test2 after request.
  4. D:\django_project\backend_ch1_sec1\ops\middlewaredemo.py: __call__: 16 INFO - TestMiddlerware after request.
  5. E:\Python\lib\site-packages\django\core\servers\basehttp.py: log_message: 124 INFO - "GET /api/v1.0/service/hello?info=beijing HTTP/1.1" 200 20

从console输出可知,顺序执行,并且两次进过middleware

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Django中间技术

    怎么理解中间件呢,其实如果你使用过java和数据库你就知道,中间件技术是两个模块中间的桥梁,就好比两块大陆之间的一座桥梁 > 如果需要详细了解中间件技术可以查看此文档

    相关 django中间

    中间件函数是django框架给我们预留的函数接口,让我们可以干预请求和应答的过程。 ![1682918-20190610110717958-1367766905.png][]