middleware.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from django.http import Http404, HttpResponse
  2. from django.template import engines
  3. from django.template.response import TemplateResponse
  4. from django.utils.decorators import (
  5. async_only_middleware, sync_and_async_middleware, sync_only_middleware,
  6. )
  7. log = []
  8. class BaseMiddleware:
  9. def __init__(self, get_response):
  10. self.get_response = get_response
  11. def __call__(self, request):
  12. return self.get_response(request)
  13. class ProcessExceptionMiddleware(BaseMiddleware):
  14. def process_exception(self, request, exception):
  15. return HttpResponse('Exception caught')
  16. @async_only_middleware
  17. class AsyncProcessExceptionMiddleware(BaseMiddleware):
  18. async def process_exception(self, request, exception):
  19. return HttpResponse('Exception caught')
  20. class ProcessExceptionLogMiddleware(BaseMiddleware):
  21. def process_exception(self, request, exception):
  22. log.append('process-exception')
  23. class ProcessExceptionExcMiddleware(BaseMiddleware):
  24. def process_exception(self, request, exception):
  25. raise Exception('from process-exception')
  26. class ProcessViewMiddleware(BaseMiddleware):
  27. def process_view(self, request, view_func, view_args, view_kwargs):
  28. return HttpResponse('Processed view %s' % view_func.__name__)
  29. @async_only_middleware
  30. class AsyncProcessViewMiddleware(BaseMiddleware):
  31. async def process_view(self, request, view_func, view_args, view_kwargs):
  32. return HttpResponse('Processed view %s' % view_func.__name__)
  33. class ProcessViewNoneMiddleware(BaseMiddleware):
  34. def process_view(self, request, view_func, view_args, view_kwargs):
  35. log.append('processed view %s' % view_func.__name__)
  36. return None
  37. class ProcessViewTemplateResponseMiddleware(BaseMiddleware):
  38. def process_view(self, request, view_func, view_args, view_kwargs):
  39. template = engines['django'].from_string('Processed view {{ view }}{% for m in mw %}\n{{ m }}{% endfor %}')
  40. return TemplateResponse(request, template, {'mw': [self.__class__.__name__], 'view': view_func.__name__})
  41. class TemplateResponseMiddleware(BaseMiddleware):
  42. def process_template_response(self, request, response):
  43. response.context_data['mw'].append(self.__class__.__name__)
  44. return response
  45. @async_only_middleware
  46. class AsyncTemplateResponseMiddleware(BaseMiddleware):
  47. async def process_template_response(self, request, response):
  48. response.context_data['mw'].append(self.__class__.__name__)
  49. return response
  50. class LogMiddleware(BaseMiddleware):
  51. def __call__(self, request):
  52. response = self.get_response(request)
  53. log.append((response.status_code, response.content))
  54. return response
  55. class NoTemplateResponseMiddleware(BaseMiddleware):
  56. def process_template_response(self, request, response):
  57. return None
  58. @async_only_middleware
  59. class AsyncNoTemplateResponseMiddleware(BaseMiddleware):
  60. async def process_template_response(self, request, response):
  61. return None
  62. class NotFoundMiddleware(BaseMiddleware):
  63. def __call__(self, request):
  64. raise Http404('not found')
  65. class TeapotMiddleware(BaseMiddleware):
  66. def __call__(self, request):
  67. response = self.get_response(request)
  68. response.status_code = 418
  69. return response
  70. @async_only_middleware
  71. def async_teapot_middleware(get_response):
  72. async def middleware(request):
  73. response = await get_response(request)
  74. response.status_code = 418
  75. return response
  76. return middleware
  77. @sync_and_async_middleware
  78. class SyncAndAsyncMiddleware(BaseMiddleware):
  79. pass
  80. @sync_only_middleware
  81. class DecoratedTeapotMiddleware(TeapotMiddleware):
  82. pass
  83. class NotSyncOrAsyncMiddleware(BaseMiddleware):
  84. """Middleware that is deliberately neither sync or async."""
  85. sync_capable = False
  86. async_capable = False
  87. def __call__(self, request):
  88. return self.get_response(request)