Джанго: Есть ли способ отфильтровать ответы 503 «служба недоступна» из обработчика журнала mail_admins?

У меня есть django LOGGING, настроенный со стандартными почтовыми администраторами на 500 ошибок:

'mail_admins': {
    'level': 'ERROR',
    'filters': ['require_debug_false'],
    'class': 'django.utils.log.AdminEmailHandler'
},

Когда я перевожу сайт в режим обслуживания (django-maintenance-mode), он правильно отвечает 503 Сервис недоступен для анонимных запросов. Это вызывает шквал электронных писем администраторам, когда сайт находится в режиме обслуживания. Я хочу отфильтровать ответ 503, если сайт находится в режиме обслуживания, чтобы остановить флуд. Но не вижу простого способа сделать это (например, фильтру ведения журнала потребуется запрос, чтобы проверить, находится ли сайт в режиме обслуживания)

Я знаю, что могу изменить код ошибки обслуживания на ошибку уровня 400, но это похоже на не семантический хак. Также можно приостановить электронную почту администратора во время обслуживания, но для этого необходимо не забыть взломать / восстановить файл настроек. Надеюсь, у кого-то есть умная идея, как добиться этого просто, без хаков.


person powderflask    schedule 28.11.2020    source источник


Ответы (2)


На самом деле, я могу предложить хакерский метод. Вы можете создать класс, который наследует класс AdminEmailHandler.

class CustomAdminEmailHandler(AdminEmailHandler):
    def send_mail(self, subject, message, *args, **kwargs):
        if 'service unavailable' in subject.lower(): # Not sure about the condition, you can find the correct one by debugging.
            super().send_email(subject, message, *args, **kwargs)

Не забудьте изменить класс mail_admins на новый в настройках.

person Ogulcan Olguner    schedule 29.11.2020
comment
О да. Это хорошая идея. Но по-прежнему нет возможности проверить, находится ли система в режиме обслуживания без доступа к объекту запроса. Я не хочу блокировать такие ошибки повсеместно, только те, которые вызваны намеренным переводом сайта в режим обслуживания. Спасибо за идею - что-нибудь пожевать. - person powderflask; 29.11.2020

Вы можете просто установить DEBUG=TRUE, когда сайт находится в режиме обслуживания — я имею в виду, что это прямо в вашей конфигурации ведения журнала. ДОХ!

Тем не менее, требуется изменить файл настроек, а затем не забыть изменить его при выходе из обслуживания. Немного хакерский, но в остальном кажется довольно простым.

person powderflask    schedule 29.11.2020