Skip to content

Commit e48aa5e

Browse files
committed
panels(templates): avoid evaluating LazyObject
LazyObject is typically used for something expensive to evaluate, so avoid evaluating it just for showing it in the debug toolbar.
1 parent 199c2b3 commit e48aa5e

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

debug_toolbar/panels/templates/panel.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,15 @@ def _store_template_info(self, sender, **kwargs):
9696
if pformatted is None:
9797
temp_layer = {}
9898
for key, value in context_layer.items():
99+
# Do not force evaluating LazyObject
100+
if hasattr(value, "_wrapped"):
101+
# SimpleLazyObject has __repr__ which includes actual value
102+
# if it has been already evaluated
103+
temp_layer[key] = repr(value)
99104
# Replace any request elements - they have a large
100105
# Unicode representation and the request data is
101106
# already made available from the Request panel.
102-
if isinstance(value, http.HttpRequest):
107+
elif isinstance(value, http.HttpRequest):
103108
temp_layer[key] = "<<request>>"
104109
# Replace the debugging sql_queries element. The SQL
105110
# data is already made available from the SQL panel.

docs/changes.rst

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Pending
55
-------
66

77
* Removed outdated third-party panels from the list.
8+
* Avoid evaluating ``LazyObject`` in the templates panel.
89

910
4.2.0 (2023-08-10)
1011
------------------

tests/panels/test_template.py

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from django.contrib.auth.models import User
33
from django.template import Context, RequestContext, Template
44
from django.test import override_settings
5+
from django.utils.functional import SimpleLazyObject
56

67
from ..base import BaseTestCase, IntegrationTestCase
78
from ..forms import TemplateReprForm
@@ -109,6 +110,14 @@ def test_empty_context(self):
109110
["{'False': False, 'None': None, 'True': True}"],
110111
)
111112

113+
def test_lazyobject(self):
114+
response = self.panel.process_request(self.request)
115+
t = Template("")
116+
c = Context({"lazy": SimpleLazyObject(lambda: "lazy_value")})
117+
t.render(c)
118+
self.panel.generate_stats(self.request, response)
119+
self.assertNotIn("lazy_value", self.panel.content)
120+
112121

113122
@override_settings(
114123
DEBUG=True, DEBUG_TOOLBAR_PANELS=["debug_toolbar.panels.templates.TemplatesPanel"]

0 commit comments

Comments
 (0)