На самом деле Django делает это проще, чем воровать кусок пирога у годовалого ребенка . Все, что вам нужно, это написать функцию process_exception () в классе, который должен быть добавлен в MIDDLEWARE_CLASSES .Исходя из этого, вы можете продвинуться в обработке ошибок довольно далеко.
Вы можете создать файл middleware.py в корневом каталоге вашего проекта.Затем добавьте его в настройки:
MIDDLEWARE_CLASSES = [
# [....] all other middlewares above
'middleware.ExceptionMiddleware',
]
Если у вас отличный django-sentry, вы, вероятно, захотите обработать только некоторые исключения, а оставшуюся часть оставить django-sentry.В этом случае вы можете создать такой параметр:
EXCEPTION_MIDDLEWARE_HANDLES = [
'ServerOverloaded',
# [...] other exception class names that you want to handle in your middleware
'BetTooLateException',
]
Я покажу вам пример промежуточного программного обеспечения , который реализует process_request () и обрабатывает исключения, имена классов которых содержатся в EXCEPTION_MIDDLEWARE_HANDLES.,Это может не совсем соответствовать вашим потребностям, но на самом деле trivial to adapt to your own needs
:
from django import http
from django import template
from django.template import loader
from django.conf import settings
class ExceptionMiddleware(object):
def process_exception(self, request, exception):
if settings.DEBUG: # don't do anything in debug mode
return None
# here i use a setting because i want some exception to be caught by sentry
# but you can remove this if you want your middleware to handle all exceptions
if exception.__class__.__name__ not in settings.EXCEPTION_MIDDLEWARE_HANDLES:
return None
# time to prepare the error response
context = {
'error': exception.__class__.__name__,
'exception': exception,
}
response = http.HttpResponse(
loader.render_to_string(
'error.html',
context,
context_instance=template.RequestContext(request)
),
status=504
)
# maybe it'll be fixed in 5 minutes ? tell bots to come back
response['Retry-After'] = 5*60
return response
Детализация происходит в template / error.html :
{% extends 'site_base.html' %}
{% load i18n %}
{% block body %}
<h1>{% trans 'Oopsie' %} !</h1>
<p>
{% if error == 'ServerOverloaded' %}
{% blocktrans %}It's not your fault but our data provider is overloaded for the moment - and we don't have any cached version of the data you requested. Our techie has been notified but it's unlikely that he can do anything about it. Would you please try again later ?{% endblocktrans %}
{% endif %}
[.......]
{% if error == 'BetTooLateException' %}
{% with exception.bet.session as session %}
{% blocktrans %}You may not bet on {{ session }} because it has already started.{% endblocktrans %}
{% endwith %}
{% endif %}
{% endblock %}
Попробуйтемаксимально детализировать ошибки и особенно избегать стресса для пользователя.Подумайте о старших неофитах, которые прочтут ваше сообщение об ошибке.В случае первого исключения, я думаю, совершенно ясно, что пользователь не сделал ничего плохого и что это временно.
В другом случае, BetTooLateException, ну, мы, вероятно, только что обманули мошенника:)
И, кстати, исключение BetTooLateException выдается моделью - из сигнала pre_save .Так что это, вероятно, очень похоже на то, что вы пытаетесь сделать в соответствии с тем, что я понимаю из ваших предыдущих вопросов.