Как скрыть исключения GraphQL в клубнике и Django?Python

Программы на Python
Ответить
Anonymous
 Как скрыть исключения GraphQL в клубнике и Django?

Сообщение Anonymous »

Я использую GraphQL с клубникой в ​​своем проекте Django. Когда возникает исключение, ошибка отображается в терминале, как и ошибки сервера. Но если пользователь допустил ошибку при создании запроса, это не должно отображаться так. Вот одна из ошибок.

Код: Выделить всё

GraphQL request:18:5
17 | #   }
18 |     register(name: "Mahmuud Hasan", email: "test@gmail.com", password: "admin"){
|     ^
19 |     success
Traceback (most recent call last):
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/graphql/execution/execute.py", line 523, in execute_field
result = resolve_fn(source, info, **args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver
return _get_result_with_extensions(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver
return reduce(
^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result
return _get_result(
^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result
return field.get_result(
^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/field.py", line 232, in get_result
return self.base_resolver(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__
return self.wrapped_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/main/mutations.py", line 47, in register
raise GraphQLError("Email already in use.", extensions={"code": "BAD_USER_INPUT"})
graphql.error.graphql_error.GraphQLError: Email already in use.
Я не хочу показывать подобные ошибки в своем терминале. Я пытался создавать собственные сообщения об ошибках и возвращал их в качестве ответа вместо того, чтобы создавать исключения. Но внешний разработчик использует клиент Apollo, и он не сможет распознать ошибки, если я не сделаю это с помощью исключения.

Код: Выделить всё

{
"data": null,
"errors": [
{
"message": "Email already in use.",
"locations": [
{
"line": 18,
"column": 5
}
],
"path": [
"register"
],
"extensions": {
"code": "BAD_USER_INPUT"
}
}
]
}
Ответ, который я возвращаю из серверной части, всегда поступает в блок данных, но он ожидает данные поля ошибок, которые показывают, если я вызываю исключение.
Я также пытался использовать Strawberry.extensions.SchemaExtension, чтобы скрыть ошибки. Но ошибки выводятся до запуска функции on_operation.
Мой код Schema.py:

Код: Выделить всё

import strawberry
from .queries import Query
from .mutations import Mutation
from strawberry.extensions import SchemaExtension
from graphql import GraphQLError

class CustomErrorHandlingExtension(SchemaExtension):
def on_operation(self):
yield
result = self.execution_context.result
print("Execution result:", result)
print("Execution errors:", result.errors if result else "No result")
if result and result.errors:
for error in result.errors:
if not isinstance(error.original_error, GraphQLError):
error.message = "An unexpected error occurred.  Please try again later."
error.extensions = {"code": "INTERNAL_SERVER_ERROR"}

schema = strawberry.Schema(query=Query, mutation=Mutation, extensions=[CustomErrorHandlingExtension])
А вот ответ об ошибке

Код: Выделить всё

GraphQL request:18:5
17 | #   }
18 |     register(name: "Mahmuud Hasan", email: "test@gmail.com", password: "admin"){
|     ^
19 |     success
Traceback (most recent call last):
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/graphql/execution/execute.py", line 523, in execute_field
result = resolve_fn(source, info, **args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver
return _get_result_with_extensions(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver
return reduce(
^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result
return _get_result(
^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result
return field.get_result(
^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/field.py", line 232, in get_result
return self.base_resolver(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__
return self.wrapped_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/main/mutations.py", line 47, in register
raise GraphQLError("Email already in use.", extensions={"code": "BAD_USER_INPUT"})
graphql.error.graphql_error.GraphQLError: Email already in use.
Execution result: ExecutionResult(data=None, errors=[GraphQLError('Email already in use.', locations=[SourceLocation(line=18, column=5)], path=['register'], extensions={'code': 'BAD_USER_INPUT'})])
Execution errors: [GraphQLError('Email already in use.', locations=[SourceLocation(line=18, column=5)], path=['register'], extensions={'code': 'BAD_USER_INPUT'})]
Я также пытался переопределить функцию отчета об ошибках, но она тоже не работает.

Код: Выделить всё

from strawberry.django.views import GraphQLView

class CustomGraphQLView(GraphQLView):

def get_context(self, request, response):

return {
"request": request,
"response": response
}

def report_errors(self, errors, result):
filtered_errors = []

for error in errors:
if isinstance(error.original_error, GraphQLError):
logger.info(f"GraphQL Validation Error: {error.message}")
else:
filtered_errors.append(error)

if filtered_errors:
super().report_errors(filtered_errors, result)
Я не могу найти правильное решение этой проблемы. Как я могу скрыть эти ошибки?


Подробнее здесь: https://stackoverflow.com/questions/798 ... and-django
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»