graphene-django/graphene_django/debug/middleware.py

70 lines
2.3 KiB
Python
Raw Permalink Normal View History

from django.db import connections
from .exception.formating import wrap_exception
from .sql.tracking import unwrap_cursor, wrap_cursor
from .types import DjangoDebug
class DjangoDebugContext:
def __init__(self):
2023-02-13 19:19:38 +03:00
self.debug_result = None
self.results = []
self.object = DjangoDebug(sql=[], exceptions=[])
self.enable_instrumentation()
2023-02-13 19:19:38 +03:00
def get_debug_result(self):
if not self.debug_result:
self.debug_result = self.results
self.results = []
return self.on_resolve_all_results()
def on_resolve_error(self, value):
if hasattr(self, "object"):
self.object.exceptions.append(wrap_exception(value))
2023-02-13 19:19:38 +03:00
return value
2023-02-13 19:19:38 +03:00
def on_resolve_all_results(self):
if self.results:
self.debug_result = None
return self.get_debug_result()
self.disable_instrumentation()
return self.object
2023-02-13 19:19:38 +03:00
def add_result(self, result):
if self.debug_result:
self.results.append(result)
def enable_instrumentation(self):
# This is thread-safe because database connections are thread-local.
for connection in connections.all():
wrap_cursor(connection, self)
def disable_instrumentation(self):
for connection in connections.all():
unwrap_cursor(connection)
class DjangoDebugMiddleware:
2017-07-28 19:43:27 +03:00
def resolve(self, next, root, info, **args):
context = info.context
2018-07-20 02:51:33 +03:00
django_debug = getattr(context, "django_debug", None)
if not django_debug:
if context is None:
2018-07-20 02:51:33 +03:00
raise Exception("DjangoDebug cannot be executed in None contexts")
try:
context.django_debug = DjangoDebugContext()
except Exception:
2018-07-20 02:51:33 +03:00
raise Exception(
"DjangoDebug need the context to be writable, context received: {}.".format(
context.__class__.__name__
)
)
if info.schema.get_type("DjangoDebug") == info.return_type:
2023-02-13 19:19:38 +03:00
return context.django_debug.get_debug_result()
try:
2023-02-13 19:19:38 +03:00
result = next(root, info, **args)
except Exception as e:
return context.django_debug.on_resolve_error(e)
2023-02-13 19:19:38 +03:00
context.django_debug.add_result(result)
return result