from django.core.exceptions import PermissionDenied from django.template.response import TemplateResponse from django.test import SimpleTestCase, modify_settings, override_settings from django.urls import path class MiddlewareAccessingContent: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) # Response.content should be available in the middleware even with a # TemplateResponse-based exception response. assert response.content return response def template_response_error_handler(request, exception=None): return TemplateResponse(request, 'test_handler.html', status=403) def permission_denied_view(request): raise PermissionDenied urlpatterns = [ path('', permission_denied_view), ] handler403 = template_response_error_handler @override_settings(ROOT_URLCONF='handlers.tests_custom_error_handlers') @modify_settings(MIDDLEWARE={'append': 'handlers.tests_custom_error_handlers.MiddlewareAccessingContent'}) class CustomErrorHandlerTests(SimpleTestCase): def test_handler_renders_template_response(self): """ BaseHandler should render TemplateResponse if necessary. """ response = self.client.get('/') self.assertContains(response, 'Error handler content', status_code=403)