Лучшая практика для обработки глобальных ошибок 500 в Django?

#python #django

#python #django

Вопрос:

У меня есть приложение django, работающее с MySQL и Redis в качестве серверной части

У меня есть функция, вызываемая redis_helper() для выполнения запросов redis.

Но иногда происходит сбой Redis, и требуется время для загрузки, поэтому мне нужно вернуть дружественное сообщение об ошибке HTTP 500.

Проблема в том, что django определяет только Http404(Exception) класс в django/http/__init__.py , а не Http500() , поэтому мне приходится вручную добавлять try ... except в каждую функцию представления, где redis_helper() была задействована. Это кажется немного уродливым и повторяющимся.

Есть ли какой-либо удобный способ вызвать ошибку сервера 500, не используя return HttpResponseServerError() функции просмотра? Если мне нужно самому написать Http500 класс, в какой файл лучше всего его записать?

С уважением и благодарностью!

Комментарии:

1. Конкретного исключения Http500 не существует. В принципе, вы не хотите делать что-то подобное, поскольку это может скрыть вашу исходную ошибку. Оставайтесь с вашим блоком try-except.

Ответ №1:

Похоже, у вас нет try: блока вокруг Redis вызова.

Так ли это?

Если это так, ответ — использовать try: блок.

поэтому я должен вручную добавить try … за исключением каждой функции просмотра, где был задействован redis_helper ().

Правильно.

Это кажется немного уродливым и повторяющимся.

Неверно. Каждая функция просмотра должна возвращать HttpResponse объект. Вы должны на самом деле написать этот код.

Прошу прощения, если написание функций просмотра кажется повторяющимся, но именно так они и должны работать. Они должны возвращать HttpResponse объект.


Редактировать. Также. Пожалуйста, прочтите это:

http://docs.djangoproject.com/en/1.3/topics/http/views/#the-500-server-error-view

Комментарии:

1. хорошо, у меня есть try блок, но что мне делать raise , если что-то не так?

2. @est: raise ? Зачем вам что-то создавать? Вы можете вернуть HttpResponse с сообщением об ошибке. Почему вы пытаетесь raise что-то сделать?

3. @S.Лотт «возвращая HttpResponse», вы имели в виду, что я должен изменять каждую функцию в views.py который вызвал edis_helper() ? Я думаю, что смысл изобретения raise Http500 в том, чтобы избежать этого.

4. @est: «измените каждую функцию в views.py который вызвал edis_helper()». Да. Это одно из решений, которое всегда работает. Их не может быть так много. Если это так, вы действительно плохо поработали с дизайном.

5. @S.Лотт Почему многократный вызов redis_helper() — это плохой дизайн? Позвольте мне спросить вас, как бы вы написали конкретную унифицированную страницу ошибок, если auth.users модель django пошла не так?

Ответ №2:

хорошо, теперь я понимаю, как Http404 работает. Итак, вы должны где-то определить это Http500 исключение и перехватить его в промежуточном программном обеспечении.