from __future__ import annotations import inspect from jinja2 import Template from .wrappers import Response TEMPLATE = """

{{ name }} {{ value }}

""" async def traceback_response(error: Exception) -> Response: type_ = type(error) tb = error.__traceback__ frames = [] while tb: frame = tb.tb_frame try: code = inspect.getsourcelines(frame) except OSError: code = None frames.append( { "file": inspect.getfile(frame), "line": frame.f_lineno, "locals": frame.f_locals, "code": code, } ) tb = tb.tb_next name = type_.__name__ template = Template(TEMPLATE) html = template.render(frames=reversed(frames), name=name, value=error) return Response(html, 500)