|
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