中间件

流程

image.png

  1. 客户端请求 ->
  2. -> M1.process_request -> M2.process_request -> ... -> Mn.process_request
  3. -> M1.process_view -> M2.process_view -> ... -> Mn.process_view
  4. -> view函数
  5. 有异常
  6. ->Mn.process_exception -> ... -> M2.process_exception -> M1.process_response
  7. 无异常
  8. -> Mn.process_response -> ... -> M2.process_response -> M1.process_response
  9. -> 客户端

自定义中间件

在app中创建middleware.py文件

  1. from django.utils.deprecation import MiddlewareMixin
  2. class M1(MiddlewareMixin):
  3. def process_request(self, request):
  4. """
  5. 如果此处直接return 则不执行view函数
  6. 从当前中间件的process_response 开始执行返回
  7. """
  8. return HttpResponse('hehe')
  9. def process_view(self,request, callback, callback_args, callback_kwargs):
  10. """
  11. callback: views函数
  12. callback_args:
  13. callback_kwargs: views函数参数
  14. 如果执行callback函数即执行view函数 则将跳过后面的process_view函数
  15. 接着执行 process_response 函数
  16. """
  17. return callback(request, *callback_args, **callback_kwargs)
  18. def process_response(self, request, response):
  19. return response
  20. def process_exception(self, request, exception):
  21. """
  22. view有异常时才出发
  23. 如果处理的异常则不继续执行后面的process_exception
  24. """
  25. pass
  26. def process_template_response(self, request, response):
  27. """
  28. 视图函数中有render返回时才会执行
  29. """
  30. pass
  1. '''
  2. settings.py中注册
  3. --------------------------
  4. 中间件的顺序按照list中顺序执行
  5. '''
  6. MIDDLEWARE = [
  7. 'django.middleware.security.SecurityMiddleware',
  8. 'django.contrib.sessions.middleware.SessionMiddleware',
  9. 'django.middleware.common.CommonMiddleware',
  10. 'django.middleware.csrf.CsrfViewMiddleware',
  11. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  12. 'django.contrib.messages.middleware.MessageMiddleware',
  13. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  14. # ...
  15. ]

上下文渲染器

可解决在多个template中都需要显示相同的数据,无需在每个view中都传一次值

自定义上下文渲染器

在项目同名的目录中(即settings.py同级目录中)创建context_processor.py文件

  1. def myuser(request):
  2. """
  3. 返回字典,key名即可在template中直接调用
  4. """
  5. return {'key1': 'value1'}
  1. TEMPLATES = [
  2. {
  3. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  4. 'DIRS': [],
  5. 'APP_DIRS': True,
  6. 'OPTIONS': {
  7. 'context_processors': [
  8. 'django.template.context_processors.debug',
  9. 'django.template.context_processors.request',
  10. 'django.contrib.auth.context_processors.auth',
  11. 'django.contrib.messages.context_processors.messages',
  12. # 添加配置
  13. 'projectname.context_processor.myuser',
  14. ],
  15. },
  16. },
  17. ]