#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
исключение и перехватить его в промежуточном программном обеспечении.