diff --git a/starlette/middleware/errors.py b/starlette/middleware/errors.py index 0d153ac4..9c9005c2 100644 --- a/starlette/middleware/errors.py +++ b/starlette/middleware/errors.py @@ -52,6 +52,11 @@ p { .collapsed { display: none; } +.source-code { + font-family: courier; + font-size: small; + padding-bottom: 10px; +} """ JS = """ @@ -96,9 +101,9 @@ FRAME_TEMPLATE = """

File {frame_filename}, line {frame_lineno}, in {frame_name} - + {collapse_button}

-
{code_context}
+
{code_context}
""" @@ -183,7 +188,9 @@ class ServerErrorMiddleware: return LINE.format(**values) return CENTER_LINE.format(**values) - def generate_frame_html(self, frame: inspect.FrameInfo, center_lineno: int) -> str: + def generate_frame_html( + self, frame: inspect.FrameInfo, center_lineno: int, is_collapsed: bool + ) -> str: code_context = "".join( self.format_line(context_position, line, frame.lineno, center_lineno) for context_position, line in enumerate(frame.code_context) @@ -194,6 +201,8 @@ class ServerErrorMiddleware: "frame_lineno": frame.lineno, "frame_name": frame.function, "code_context": code_context, + "collapsed": "collapsed" if is_collapsed else "", + "collapse_button": "+" if is_collapsed else "‒", } return FRAME_TEMPLATE.format(**values) @@ -206,9 +215,12 @@ class ServerErrorMiddleware: ) center_lineno = int((limit - 1) / 2) - exc_html = "".join( - self.generate_frame_html(frame, center_lineno) for frame in reversed(frames) - ) + exc_html = "" + is_collapsed = False + for frame in reversed(frames): + exc_html += self.generate_frame_html(frame, center_lineno, is_collapsed) + is_collapsed = True + error = f"{traceback_obj.exc_type.__name__}: {traceback_obj}" return TEMPLATE.format(styles=STYLES, js=JS, error=error, exc_html=exc_html)