Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve error message when template is rendered without request context #300

Closed
timobrembeck opened this issue Sep 28, 2021 · 13 comments
Closed

Comments

@timobrembeck
Copy link

timobrembeck commented Sep 28, 2021

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'

Source: https://app.circleci.com/pipelines/github/Integreat/integreat-cms/2610/workflows/c4feb10f-3d0d-48b8-b094-681db5a6d8d0/jobs/19913

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!

@fjsj
Copy link
Member

fjsj commented Sep 28, 2021

Thanks, we imagined there could be some unexpected edge case related to this.
Just to confirm, you're using Template.render with a template that calls django-webpack-loader, right?

@fjsj
Copy link
Member

fjsj commented Sep 28, 2021

FYI @karolyi

@timobrembeck
Copy link
Author

Thanks, we imagined there could be some unexpected edge case related to this. Just to confirm, you're using Template.render with a template that calls django-webpack-loader, right?

Yes, we use the tag render_bundle in that template which gets rendered here.

@karolyi
Copy link
Contributor

karolyi commented Sep 28, 2021

I built in a preliminary check for the middleware in the code, but it didn't seem to be enough.

I can come up with some mods for this.

@karolyi
Copy link
Contributor

karolyi commented Sep 28, 2021

So, originally I knew this change would be a can of worms that we just opened: in order for the deduplication code to know which chunks have been rendered, you need some kind of a variable that is local throughout the generation of the template(s). There are a couple issues with this:

  • Modifying the contents of context is highly discouraged, in Jinja it's outright disallowed (you can't modify the context, only it's parent, but that is not there for that either.
  • Django's synchronous execution model (with using WSGI) uses one thread to execute a request. The request is basically stored as a thread local, there is even code for getting the request from there.
  • Still, as visible in this issue, template renderings can be used without a request variable, and as an edge case, one request-response cycle can be responsible for rendering dozens of templates (like here for example, rendering static pages). Even if you manage to get the original request variable, there will be missing script tags in the second template and on (with using skip_common_chunks), since we don't reset the set of rendered tags at each render, nor do we know a way for it.
  • As an even bigger can of worms, asynchronous mode (with using ASGI) doesn't even have a request variable, much less makes it sense to use any thread locals since it's not guaranteed that the code will run in the same thread. (Other than than using thread_sensitive=True in sync_to_async(), that is the default in newer djangos but still I wouldn't rely on that.)

All I took care with my using of the request variable is to cover the most usecases for when django is used; rendering one template at each request-response cycle.

To be constructive, I'd suggest the following optional resolutions:

  • We can still go ahead and use the context variable, but it's a HUGE risk, and I still don't know the repercussions of it. Jinja for example starts with the assumption that the context is not modified while rendering templates, and thus I have no idea what breakages it will induce if we rewrite the code to do that. Not to mention that by the logic of this issue, one could use NO CONTEXT for rendering templates at all.
  • We can check and use a thread local variable that is somehow identified with the currently running request/context, and use only the request/context that belongs to our template rendering iteration. Garbage collection and not found context/request is not a small issue here.
  • The most easy way is to just force the usage of the request (and context) variable (even if it's a fake generated django.http.HttpRequest). That way users that use these edge cases can have a more fine-grained control over their deduplications in their generated templates.

Of course, these users will need to understand the reason why a request is necessary. I can add this to the documentation and point to it from the error that is generated when request is not found (or context is None, for that matter).

Suggestions?

@fjsj
Copy link
Member

fjsj commented Sep 29, 2021

Thanks for the inputs and suggestions @karolyi. My suggestions:

  • I think this skip_common_chunks functionality is already an edge case: one should try to have a single entrypoint per template anyway. Therefore, I'm more concerned about making the render_bundle work when there is no request in context. We should launch as soon as possible a patch fix that simply ignores this new functionality when there's no request in context. LMK if you can/want to work on that, if not I'll work on a fix.
  • As for thread safety issues vs. using request, it seems Django templates allow altering the context.render_context variable between template node calls, please check the cycle example in docs and "Setting a variable in the context". If Django templates support that, but Jinja doesn't, I think it's fair to disable the skip_common_chunks in Jinja (it's better to do that to help support no-request rendering).

Please LMK your thoughts.

@karolyi
Copy link
Contributor

karolyi commented Sep 29, 2021

I am specifically that edge case: my templates stopped functioning with Jinja because of the multiple chunk inclusion, so I vote against removing it from Jinja. The forcing of one-entry-point-per-template is very unwarranted in my opinion, YMMV of course.

I can support the ignoring of skip_common_chunks with a runtime warning, when no request object is available. Still, additional documentation on it is necessary for the developers working with it.

I can make the changes for that, if necessary.

@fjsj
Copy link
Member

fjsj commented Sep 29, 2021

I see, I think it would be great if you could make a PR for the ignoring of skip_common_chunks with a runtime warning, when no request object is available. Thanks!

@karolyi
Copy link
Contributor

karolyi commented Sep 29, 2021

Alright, coming up hopefully within a couple days.

@felipe3dfx
Copy link

Hello, the last version (1.4.0) raise KeyError when trying to render error pages (500 / 403).

KeyError: 'detalle'
  File "asgiref/sync.py", line 482, in thread_handler
    raise exc_info[1]
  File "django/core/handlers/exception.py", line 38, in inner
    response = await get_response(request)
  File "django/core/handlers/base.py", line 233, in _get_response_async
    response = await wrapped_callback(request, *callback_args, **callback_kwargs)
  File "asgiref/sync.py", line 444, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "asyncio/tasks.py", line 455, in wait_for
    return await fut
  File "asgiref/current_thread_executor.py", line 22, in run
    result = self.fn(*self.args, **self.kwargs)
  File "asgiref/sync.py", line 486, in thread_handler
    return func(*args, **kwargs)
  File "django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "django/contrib/auth/mixins.py", line 71, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "django/views/generic/base.py", line 159, in get
    context = self.get_context_data(**kwargs)
  File "user/views.py", line 206, in get_context_data
    context['payment_list'] = get_payment_list(
  File "user/cache.py", line 20, in get_payment_list
    for movement in item['detalle']:
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "axes/middleware.py", line 36, in __call__
    response = self.get_response(request)
  File "asgiref/sync.py", line 223, in __call__
    return call_result.result()
  File "concurrent/futures/_base.py", line 437, in result
    return self.__get_result()
  File "concurrent/futures/_base.py", line 389, in __get_result
    raise self._exception
  File "asgiref/sync.py", line 292, in main_wrap
    result = await self.awaitable(*args, **kwargs)
  File "django/core/handlers/exception.py", line 40, in inner
    response = await sync_to_async(response_for_exception, thread_sensitive=False)(request, exc)
  File "asgiref/sync.py", line 444, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "asyncio/tasks.py", line 455, in wait_for
    return await fut
  File "concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "asgiref/sync.py", line 484, in thread_handler
    return func(*args, **kwargs)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "app/middleware.py", line 38, in __call__
    return self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "app/middleware.py", line 15, in __call__
    response = self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'request'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/utils/deprecation.py", line 117, in __call__
    response = response or self.get_response(request)
  File "django/core/handlers/exception.py", line 49, in inner
    response = response_for_exception(request, exc)
  File "django/core/handlers/exception.py", line 114, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "django/core/handlers/exception.py", line 153, in handle_uncaught_exception
    return callback(request)
  File "django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "django/views/defaults.py", line 97, in server_error
    return HttpResponseServerError(template.render())
  File "django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "django/template/base.py", line 170, in render
    return self._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "webpack_loader/templatetags/webpack_loader.py", line 39, in render_bundle
    if not hasattr(context['request'], '_webpack_loader_used_tags'):
  File "django/template/context.py", line 83, in __getitem__
    raise KeyError(key)

@karolyi
Copy link
Contributor

karolyi commented Sep 30, 2021

you can roll back to the latest version before this one or wait until I'll make the necessary changes.

@karolyi
Copy link
Contributor

karolyi commented Oct 2, 2021

So, a pull request is made now, merge, bump version and release and you're good to go.

@fjsj
Copy link
Member

fjsj commented Oct 4, 2021

1.4.1 released with those changes: https://github.com/django-webpack/django-webpack-loader/releases/tag/1.4.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants