|
3 | 3 | import re
|
4 | 4 | import sys
|
5 | 5 | from importlib import import_module
|
6 |
| -from itertools import chain |
| 6 | +from pprint import pformat |
7 | 7 |
|
8 | 8 | import django
|
9 | 9 | from django.core.exceptions import ImproperlyConfigured
|
10 | 10 | from django.template import Node
|
11 |
| -from django.template.loader import render_to_string |
| 11 | +from django.utils.html import format_html |
12 | 12 | from django.utils.safestring import mark_safe
|
13 | 13 |
|
14 | 14 | from debug_toolbar import settings as dt_settings
|
@@ -69,26 +69,31 @@ def tidy_stacktrace(stack):
|
69 | 69 |
|
70 | 70 |
|
71 | 71 | def render_stacktrace(trace):
|
72 |
| - stacktrace = [] |
73 |
| - for frame in trace: |
74 |
| - params = (v for v in chain(frame[0].rsplit(os.path.sep, 1), frame[1:])) |
75 |
| - params_dict = {str(idx): v for idx, v in enumerate(params)} |
76 |
| - try: |
77 |
| - stacktrace.append(params_dict) |
78 |
| - except KeyError: |
79 |
| - # This frame doesn't have the expected format, so skip it and move |
80 |
| - # on to the next one |
81 |
| - continue |
82 |
| - |
83 |
| - return mark_safe( |
84 |
| - render_to_string( |
85 |
| - "debug_toolbar/panels/sql_stacktrace.html", |
86 |
| - { |
87 |
| - "stacktrace": stacktrace, |
88 |
| - "show_locals": dt_settings.get_config()["ENABLE_STACKTRACES_LOCALS"], |
89 |
| - }, |
| 72 | + show_locals = dt_settings.get_config()["ENABLE_STACKTRACES_LOCALS"] |
| 73 | + html = "" |
| 74 | + for abspath, lineno, func, code, locals_ in trace: |
| 75 | + directory, filename = abspath.rsplit(os.path.sep, 1) |
| 76 | + html += format_html( |
| 77 | + ( |
| 78 | + '<span class="djdt-path">{}/</span>' |
| 79 | + + '<span class="djdt-file">{}</span> in' |
| 80 | + + ' <span class="djdt-func">{}</span>' |
| 81 | + + '(<span class="djdt-lineno">{}</span>)\n' |
| 82 | + + ' <span class="djdt-code">{}</span>\n' |
| 83 | + ), |
| 84 | + directory, |
| 85 | + filename, |
| 86 | + func, |
| 87 | + lineno, |
| 88 | + code, |
90 | 89 | )
|
91 |
| - ) |
| 90 | + if show_locals: |
| 91 | + html += format_html( |
| 92 | + ' <pre class="djdt-locals">{}</pre>\n', |
| 93 | + pformat(locals_), |
| 94 | + ) |
| 95 | + html += "\n" |
| 96 | + return mark_safe(html) |
92 | 97 |
|
93 | 98 |
|
94 | 99 | def get_template_info():
|
|
0 commit comments