Skip to content

Commit 47b4c8d

Browse files
committed
Move header value creation into the panels.
This moves more logic into the Panel class and gives greater control to the Panel subclasses on how things should work.
1 parent 36e4413 commit 47b4c8d

File tree

4 files changed

+39
-30
lines changed

4 files changed

+39
-30
lines changed

debug_toolbar/middleware.py

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ def __call__(self, request):
7171
# included in the response.
7272
rendered = toolbar.render_toolbar()
7373

74-
response = self.generate_headers(request, response, toolbar.enabled_panels)
74+
for header, value in self.get_headers(request, toolbar.enabled_panels).items():
75+
response.headers[header] = value
7576

7677
# Check for responses where the toolbar can't be inserted.
7778
content_encoding = response.get("Content-Encoding", "")
@@ -96,24 +97,12 @@ def __call__(self, request):
9697
return response
9798

9899
@staticmethod
99-
def generate_headers(request, response, panels):
100-
stats_data = []
101-
100+
def get_headers(request, panels):
101+
headers = {}
102102
for panel in panels:
103-
response = panel.generate_headers(request, response)
104-
stats = panel.get_server_timing_stats()
105-
if not stats:
106-
continue
107-
108-
for key, record in stats.items():
109-
# example: `SQLPanel_sql_time;dur=0;desc="SQL 0 queries"`
110-
stats_data.append(
111-
'{}_{};dur={};desc="{}"'.format(
112-
panel.panel_id, key, record.get("value"), record.get("title")
113-
)
114-
)
115-
116-
if stats_data:
117-
response.headers["Server-Timing"] = ", ".join(stats_data)
118-
119-
return response
103+
for header, value in panel.get_headers(request).items():
104+
if header in headers:
105+
headers[header] += f", {value}"
106+
else:
107+
headers[header] = value
108+
return headers

debug_toolbar/panels/__init__.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,31 @@ def process_request(self, request):
192192
"""
193193
return self.get_response(request)
194194

195-
def generate_headers(self, request, response):
195+
def get_headers(self, request):
196196
"""
197-
Attach headers to response.
197+
Get headers the panel needs to set.
198198
199-
Call after procssing the request, gives the panel an opportunity to
200-
add headers to the outgoing response
201-
"""
202-
return response
199+
Called after :meth:`process_request
200+
<debug_toolbar.panels.Panel.generate_stats>` and
201+
:meth:`process_request<debug_toolbar.panels.Panel.generate_stats>`
202+
203+
Header values will be appended if multiple panels need to set it.
204+
205+
By default it sets the Server-Timing header.
206+
207+
Return dict of headers to be appended.
208+
"""
209+
headers = {}
210+
stats = self.get_server_timing_stats()
211+
if stats:
212+
headers["Server-Timing"] = ", ".join(
213+
# example: `SQLPanel_sql_time;dur=0;desc="SQL 0 queries"`
214+
'{}_{};dur={};desc="{}"'.format(
215+
self.panel_id, key, record.get("value"), record.get("title")
216+
)
217+
for key, record in stats.items()
218+
)
219+
return headers
203220

204221
def generate_stats(self, request, response):
205222
"""

debug_toolbar/panels/history/panel.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ class HistoryPanel(Panel):
2121
nav_title = _("History")
2222
template = "debug_toolbar/panels/history.html"
2323

24-
def generate_headers(self, request, response):
24+
def get_headers(self, request):
25+
headers = super().get_headers(request)
2526
observe_request = get_observe_request()
2627
store_id = getattr(self.toolbar, "store_id")
2728
if store_id and observe_request(request):
28-
response.headers["DJDT-STORE-ID"] = store_id
29-
return response
29+
headers["DJDT-STORE-ID"] = store_id
30+
return headers
3031

3132
@property
3233
def enabled(self):

docs/panels.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ unauthorized access. There is no public CSS API at this time.
386386

387387
.. automethod:: debug_toolbar.panels.Panel.generate_stats
388388

389+
.. automethod:: debug_toolbar.panels.Panel.get_headers
390+
389391
.. automethod:: debug_toolbar.panels.Panel.run_checks
390392

391393
.. _javascript-api:

0 commit comments

Comments
 (0)