Как получить доступ к трассировке исключений при запросе graphene-django?
Я использую graphene-django v2.15.0, потому что это последний стабильный релиз, который тянет за собой graphene v2.1.9.
Каждый раз, когда возникает исключение во время запроса graphql, все, что я вижу, это тело ответа HTTP, которое выглядит примерно так:
{"errors":[{"message":"this is my exception","locations":[{"line":1,"column":3}],"path":["hello"]}],"data":{"hello":null}}
Только сообщение, а не трассировка, и какая-то бесполезная информация о местоположении, которая не имеет никакого отношения к причине.
Я потратил час на гугление таких вещей, как "graphene-django errors traceback", и нашел тонны результатов - но все они были людьми, пытающимися заглушить ошибки и tracebacks, а не получить к ним доступ!
Я нахожусь в неправильной временной шкале? Я стал Манделой? Что, черт возьми, происходит?
BTW - я уже пробовал следующее, основываясь на предложении, которое я нашел, но это не оказало никакого влияния на поведение, ни в ответе, ни в консоли, где у меня есть ./manage.py runserver
going.
import logging ; logging.getLogger("graphql.execution.utils").setLevel(logging.DEBUG)
Я также пробовал искать в документации graphene и graphene-django настройки для переключения, но безуспешно.
Я также попробовал добавить свое собственное промежуточное ПО для перехвата ошибок, основываясь на еще одном предложении, которое я нашел. Вот мое промежуточное ПО:
class FooMiddleware(object):
def on_error(self, error):
print(f"*** error={error}")
raise error
def resolve(self, next, root, info, **args):
print("--- we're fine down here")
return next(root, info, **args).catch(self.on_error)
Настроен:
GRAPHENE = {
....
'MIDDLEWARE': [
'g.foo.FooMiddleware',
],
}
Я вижу "--- we're fine down here", выведенное на консоль, поэтому я знаю, что промежуточное ПО вызывается - но on_error()
никогда не вызывается, даже когда возникает исключение.
ОБНОВЛЕНИЕ: Мне действительно удалось запустить метод on_error
, показанный выше, явно вызвав исключение в моем резольвере. Так что, по крайней мере, это работает.
Проблема в том, что у меня также установлен django-graphql-jwt, и в промежуточном ПО graphene возникает исключение. Это исключение проглатывается.
Полагаю, мой вопрос должен звучать так: Как я могу получить доступ к трассировке исключения, вызванного промежуточным ПО Graphene?
В обоих случаях - исключение, которое я вызвал в своем резольвере, и исключение, вызванное промежуточным ПО, которое мне все еще нужно отладить после публикации этого сообщения - трассировки начали выводиться в мою консоль сразу после того, как я установил DjangoDebugMiddleware из graphene-django.
Не было никакого способа узнать, что это преимущество появится, из документации. В документации говорится только о возможности доступа к информации через GraphQL API. Итак, очевидно, что документации недостаточно как для того, чтобы сообщить о пользе установки промежуточного ПО, так и о необходимости сделать это для любого здравомыслящего разработчика.
PS - Это моя последняя соломинка с Graphene. Как только это станет возможным, я собираюсь рассмотреть три другие зрелые альтернативы в надежде на то, что смогу порекомендовать их своему работодателю в качестве замены проекту Graphene, который, судя по всему, является беспорядочным.