|
15 | 15 |
|
16 | 16 | import flask
|
17 | 17 | from flask_compress import Compress
|
18 |
| -from werkzeug.debug.tbtools import get_current_traceback |
| 18 | + |
| 19 | +from werkzeug.debug import tbtools |
| 20 | +from werkzeug.security import gen_salt |
| 21 | + |
19 | 22 | from pkg_resources import get_distribution, parse_version
|
20 | 23 | from dash import dcc
|
21 | 24 | from dash import html
|
|
102 | 105 | _re_renderer_scripts_id = 'id="_dash-renderer', "new DashRenderer"
|
103 | 106 |
|
104 | 107 |
|
| 108 | +def _get_traceback(secret, error): |
| 109 | + def _get_skip(text): |
| 110 | + skip = 0 |
| 111 | + for i, line in enumerate(text.splitlines()): |
| 112 | + if "%% callback invoked %%" in line: |
| 113 | + skip = int((i + 1) / 2) |
| 114 | + break |
| 115 | + return skip |
| 116 | + |
| 117 | + # werkzeug<2.1.0 |
| 118 | + if hasattr(tbtools, "get_current_traceback"): |
| 119 | + tb = tbtools.get_current_traceback() |
| 120 | + skip = _get_skip(tb.plaintext) |
| 121 | + return tbtools.get_current_traceback(skip=skip).render_full() |
| 122 | + |
| 123 | + tb = tbtools.DebugTraceback(error) # pylint: disable=no-member |
| 124 | + skip = _get_skip(tb.render_traceback_text()) |
| 125 | + |
| 126 | + # pylint: disable=no-member |
| 127 | + return tbtools.DebugTraceback(error, skip=skip).render_debugger_html( |
| 128 | + True, secret, True |
| 129 | + ) |
| 130 | + |
| 131 | + |
105 | 132 | class _NoUpdate:
|
106 | 133 | # pylint: disable=too-few-public-methods
|
107 | 134 | pass
|
@@ -1756,19 +1783,16 @@ def enable_dev_tools(
|
1756 | 1783 |
|
1757 | 1784 | if debug and dev_tools.prune_errors:
|
1758 | 1785 |
|
| 1786 | + secret = gen_salt(20) |
| 1787 | + |
1759 | 1788 | @self.server.errorhandler(Exception)
|
1760 |
| - def _wrap_errors(_): |
| 1789 | + def _wrap_errors(error): |
1761 | 1790 | # find the callback invocation, if the error is from a callback
|
1762 | 1791 | # and skip the traceback up to that point
|
1763 | 1792 | # if the error didn't come from inside a callback, we won't
|
1764 | 1793 | # skip anything.
|
1765 |
| - tb = get_current_traceback() |
1766 |
| - skip = 0 |
1767 |
| - for i, line in enumerate(tb.plaintext.splitlines()): |
1768 |
| - if "%% callback invoked %%" in line: |
1769 |
| - skip = int((i + 1) / 2) |
1770 |
| - break |
1771 |
| - return get_current_traceback(skip=skip).render_full(), 500 |
| 1794 | + tb = _get_traceback(secret, error) |
| 1795 | + return tb, 500 |
1772 | 1796 |
|
1773 | 1797 | if debug and dev_tools.ui:
|
1774 | 1798 |
|
|
0 commit comments