Populate middleware lists from settings.MIDDLEWARE. Must be called after the environment is fixed (see __call__ in subclasses).
(self, is_async=False)
| 25 | _middleware_chain = None |
| 26 | |
| 27 | def load_middleware(self, is_async=False): |
| 28 | """ |
| 29 | Populate middleware lists from settings.MIDDLEWARE. |
| 30 | |
| 31 | Must be called after the environment is fixed (see __call__ in |
| 32 | subclasses). |
| 33 | """ |
| 34 | self._view_middleware = [] |
| 35 | self._template_response_middleware = [] |
| 36 | self._exception_middleware = [] |
| 37 | |
| 38 | get_response = self._get_response_async if is_async else self._get_response |
| 39 | handler = convert_exception_to_response(get_response) |
| 40 | handler_is_async = is_async |
| 41 | for middleware_path in reversed(settings.MIDDLEWARE): |
| 42 | middleware = import_string(middleware_path) |
| 43 | middleware_can_sync = getattr(middleware, "sync_capable", True) |
| 44 | middleware_can_async = getattr(middleware, "async_capable", False) |
| 45 | if not middleware_can_sync and not middleware_can_async: |
| 46 | raise RuntimeError( |
| 47 | "Middleware %s must have at least one of " |
| 48 | "sync_capable/async_capable set to True." % middleware_path |
| 49 | ) |
| 50 | elif not handler_is_async and middleware_can_sync: |
| 51 | middleware_is_async = False |
| 52 | else: |
| 53 | middleware_is_async = middleware_can_async |
| 54 | try: |
| 55 | # Adapt handler, if needed. |
| 56 | adapted_handler = self.adapt_method_mode( |
| 57 | middleware_is_async, |
| 58 | handler, |
| 59 | handler_is_async, |
| 60 | debug=settings.DEBUG, |
| 61 | name="middleware %s" % middleware_path, |
| 62 | ) |
| 63 | mw_instance = middleware(adapted_handler) |
| 64 | except MiddlewareNotUsed as exc: |
| 65 | if settings.DEBUG: |
| 66 | if str(exc): |
| 67 | logger.debug("MiddlewareNotUsed(%r): %s", middleware_path, exc) |
| 68 | else: |
| 69 | logger.debug("MiddlewareNotUsed: %r", middleware_path) |
| 70 | continue |
| 71 | else: |
| 72 | handler = adapted_handler |
| 73 | |
| 74 | if mw_instance is None: |
| 75 | raise ImproperlyConfigured( |
| 76 | "Middleware factory %s returned None." % middleware_path |
| 77 | ) |
| 78 | |
| 79 | if hasattr(mw_instance, "process_view"): |
| 80 | self._view_middleware.insert( |
| 81 | 0, |
| 82 | self.adapt_method_mode(is_async, mw_instance.process_view), |
| 83 | ) |
| 84 | if hasattr(mw_instance, "process_template_response"): |
no test coverage detected