По материалам сайта http://mariz.org/blog/2008/mar/07/django-error-notification-with-jabber/
Django обладает механизмом для уведомления об ошибках в коде возникающих когда представление выбрасывает исключение. Механизм рассылает уведомления всем, кто перечислен в параметре ADMIN
конфигурации проекта (см. settings.py
), прикладывая полную информацию об исключении и отображая стандартную страницу с ошибкой 500.
Такое поведение возможно только при выключенном режиме отладки.
Существует возможность установить свой обработчик на ошибку 500, описав переменную handler500
в корневом urls.py
. Таким образом, мы можем легко создать простое представление, которое отправляет уведомление об ошибке на наш jabber.
Первым делом понадобится установить xmpppy и dnspython:
$ easy_install xmpppy
$ easy_install dnspython
Совет: Если такие пакеты есть в вашем дистрибутиве, лучше воспользуйтесь ими.
Добавьте в settings.py
параметры для работы с jabber:
JABBER_ERROR_NOTIFICATION = True
JABBER_ID = 'your_jabberid@jabberdomain.com'
JABBER_PASSWORD = 'your_jabber_password'
JABBER_RECIPIENT = 'recipient@jabberdomain.com'
JABBER_ERROR_TEXT = 'An error occurred in "Project Name", ' + \
'please check your email.'
Код обработчика реализуем в виде отдельного приложения. Создадим приложение errors
и не забудем добавить его в список приложений (параметр INSTALLED_APPS
в settings.py
):
python manage.py startapp errors
Добавим переменную handler500
с указанием представления в корневой urls.py
:
handler500 = 'errors.views.server_error_jabber'
И наконец создадим представление в errors.view
, которое отправляет уведомление нам в jabber и возвращает стандартную страницу с ошибкой 500:
from django.views.defaults import server_error
from django.conf import settings
import xmpp, time
def server_error_jabber(request, template_name='500.html'):
if settings.JABBER_ERROR_NOTIFICATION:
jid = xmpp.protocol.JID(settings.JABBER_ID)
cl = xmpp.Client(jid.getDomain(), debug=[])
conn = cl.connect()
if conn:
auth = cl.auth(jid.getNode(), settings.JABBER_PASSWORD,
resource=jid.getResource())
if auth:
id = cl.send(xmpp.protocol.Message(settings.JABBER_RECIPIENT,
settings.JABBER_ERROR_TEXT))
# Некоторые старые сервера не отправляют сообщения,
# если вы немедленно отсоединяетесь после отправки
time.sleep(1)
return server_error(request, template_name)
Совет: Не забудьте отключить режим отладки, иначе никаких уведомлений вы не дождётесь :)