Бесконечный потоковый ответ Django регистрирует 500 в журналах apache

У меня есть сервер Django+Apache, и есть представление с бесконечным потоковым ответом

def my_view(request):
    try:
        return StreamingHttpResponse(map(
            lambda x: f"{dumps(x)}\n", 
            data_stream(...)  # yields dicts forever every couple of seconds
        ))
    except Exception as e:
        print_exc()
        return HttpResponse(dumps({
            "success": False,
            "reason": ERROR_WITH_CLASSNAME.format(e.__class__.__name__)
        }), status=500, content_type="application/json")

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

Однако после того, как последнее сообщение не доставляется, apache регистрирует код ответа 500 (100% запросов). Блок except его не перехватывает, потому что print_exc не вызывается (нет записей в журнале ошибок), поэтому я предполагаю, что это apache не может доставить ответ от django и сам переключается на 500.

Эти 500 ошибок вызывают ложные срабатывания в нашей системе мониторинга, и трудно отличить ошибку, связанную с разрывом соединения, от ошибки в логике потока данных.

Могу ли я переопределить это поведение, чтобы регистрировать другой код состояния в случае отключения клиента?

Вернуться на верх