kolofordjango / kolo

See everything happening in your running Django app. All without leaving VSCode
https://kolo.app
486 stars 14 forks source link

Kolo obscures TemplateDoesNotExist error #56

Closed lewiseason closed 1 year ago

lewiseason commented 1 year ago

If django raises a TemplateDoesNotExist, Kolo's exception handler attempts to retrieve exception_frames[-1] from the raised exception, but exception_frames is an empty list when TemplateDoesNotExist is raised, so instead an IndexError is raised (I am not sure why).

I discovered this when using django_jsonform (which I believe is why this stacktrace is so long/why it was so hard to spot - it's much more obvious with a standard template render).

Stack trace ``` Internal Server Error: /admin/clients/client/1/change/ [61/42028] Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render return self.template.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 170, in render return self._render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 162, in _render return self.nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render return compiled_parent._render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 162, in _render return self.nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render return compiled_parent._render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 162, in _render return self.nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py", line 214, in render nodelist.append(node.render_annotated(context)) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py", line 195, in render return template.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 172, in render return self._render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 162, in _render return self.nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py", line 214, in render nodelist.append(node.render_annotated(context)) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py", line 214, in render nodelist.append(node.render_annotated(context)) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py", line 315, in render return nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py", line 315, in render return nodelist.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 938, in render bit = node.render_annotated(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated return self.render(context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 994, in render return render_value_in_context(output, context) File "/usr/local/lib/python3.8/site-packages/django/template/base.py", line 973, in render_value_in_context value = str(value) File "/usr/local/lib/python3.8/site-packages/django/utils/html.py", line 376, in klass.__str__ = lambda self: mark_safe(klass_str(self)) File "/usr/local/lib/python3.8/site-packages/django/forms/boundfield.py", line 33, in __str__ return self.as_widget() + self.as_hidden(only_initial=True) File "/usr/local/lib/python3.8/site-packages/django/forms/boundfield.py", line 93, in as_widget return widget.render( File "/usr/local/lib/python3.8/site-packages/django_jsonform/widgets.py", line 73, in render return mark_safe(render_to_string(self.template_name, context)) File "/usr/local/lib/python3.8/site-packages/django/template/loader.py", line 61, in render_to_string template = get_template(template_name, using=using) File "/usr/local/lib/python3.8/site-packages/django/template/loader.py", line 19, in get_template raise TemplateDoesNotExist(template_name, chain=chain) django.template.exceptions.TemplateDoesNotExist: django_jsonform/editor.html The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py", line 204, in _get_response response = response.render() File "/usr/local/lib/python3.8/site-packages/django/template/response.py", line 105, in render self.content = self.rendered_content File "/usr/local/lib/python3.8/site-packages/django/template/response.py", line 83, in rendered_content return template.render(context, self._request) File "/usr/local/lib/python3.8/site-packages/django/template/backends/django.py", line 63, in render reraise(exc, self.backend) File "/usr/local/lib/python3.8/site-packages/django/template/backends/django.py", line 84, in reraise raise new from exc django.template.exceptions.TemplateDoesNotExist: django_jsonform/editor.html During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner response = get_response(request) File "/code/utils/middleware.py", line 54, in __call__ response = self.get_response(request) File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 49, in inner response = response_for_exception(request, exc) File "/usr/local/lib/python3.8/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 "/usr/local/lib/python3.8/site-packages/kolo/filters/exception.py", line 111, in process "bottom_exception_frame": exception_frames[-1], IndexError: list index out of range ```

This is Django 3.2, if that makes a difference.

Thank you!

LilyFoote commented 1 year ago

This should be fixed in 2.8.0.