Closed
Description
Django provides the ability to render templates outside the request context even if the django.template.context_processors.request
middleware is activated (see Template.render or render_to_string).
So it took me a bit to figure out the cause of the following error happened after updating from 1.3.0 to 1.4.0 (see digitalfabrik/integreat-cms#956):
Traceback
Traceback (most recent call last):
File "/home/circleci/project/src/cms/tests/views/view_test_utils.py", line 25, in test_function
response = self.client.get(url)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/client.py", line 742, in get
response = super().get(path, data=data, secure=secure, **extra)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/client.py", line 398, in get
**extra,
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/client.py", line 473, in generic
return self.request(**r)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/client.py", line 714, in request
response = self.handler(environ)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/client.py", line 145, in __call__
response = self.get_response(request)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 130, in get_response
response = self._middleware_chain(request)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 49, in inner
response = response_for_exception(request, exc)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 114, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 153, in handle_uncaught_exception
return callback(request)
File "/home/circleci/project/src/cms/views/error_handler/error_handler.py", line 112, in handler500
return HttpResponseServerError(render_error_template(context))
File "/home/circleci/project/src/cms/views/error_handler/error_handler.py", line 25, in render_error_template
return render_to_string("error_handler/http_error.html", context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 170, in render
return self._render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/utils.py", line 100, in instrumented_test_render
return self.nodelist.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/utils.py", line 100, in instrumented_test_render
return self.nodelist.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/test/utils.py", line 100, in instrumented_test_render
return self.nodelist.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 938, in render
bit = node.render_annotated(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/base.py", line 905, in render_annotated
return self.render(context)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/library.py", line 192, in render
output = self.func(*resolved_args, **resolved_kwargs)
File "/home/circleci/project/.venv/lib/python3.7/site-packages/webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
if not hasattr(context['request'], '_webpack_loader_used_tags'):
File "/home/circleci/project/.venv/lib/python3.7/site-packages/django/template/context.py", line 83, in __getitem__
raise KeyError(key)
KeyError: 'request'
I would suggest to throw a more helpful error in this case, stating that it's not possible to use Template.render without passing the current request to the template context. (Or, if somehow possible, allow the rendering without the request object...)
Thanks!
Metadata
Metadata
Assignees
Labels
No labels