Бесконечный потоковый ответ 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 ошибок вызывают ложные срабатывания в нашей системе мониторинга, и трудно отличить ошибку, связанную с разрывом соединения, от ошибки в логике потока данных.
Могу ли я переопределить это поведение, чтобы регистрировать другой код состояния в случае отключения клиента?