Выполнить код в Django после отправки ответа клиенту

В моем приложении Django я хочу отслеживать, был ли ответ успешно отправлен клиенту. Я хорошо знаю, что нет никакого "водонепроницаемого" способа в протоколе без установления соединения, например HTTP, чтобы гарантировать, что клиент получил (и отобразил) ответ, поэтому это не будет критически важной функциональностью, но все же я хочу сделать это на последнее возможное время. Ответ не будет HTML, поэтому любые обратные вызовы от клиента (с использованием тегов Javascript или IMG и т.д.) Невозможны.

"Самый последний" крюк, который я могу найти, будет заключаться в добавлении настраиваемого промежуточного программного обеспечения, реализующего process_response в первой позиции списка промежуточного программного обеспечения, но, насколько мне известно, это выполняется до того, как будет создан и отправлен клиенту фактический ответ. Есть ли какие-либо крючки/события в Django для выполнения кода после успешного ответа ответа?

Ответы

Ответ 1

В моем методе используется подкласс HttpResponse:

from django.template import loader
from django.http import HttpResponse

# use custom response class to override HttpResponse.close()
class LogSuccessResponse(HttpResponse):

    def close(self):
        super(LogSuccessResponse, self).close()
        # do whatever you want, this is the last codepoint in request handling
        if self.status_code == 200:
            print('HttpResponse successful: %s' % self.status_code)

# this would be the view definition
def logging_view(request):
    response = LogSuccessResponse('Hello World', mimetype='text/plain')
    return response

Читая код Django, я очень убежден, что HttpResponse.close() является последним моментом для ввода кода в обработку запроса. Я не уверен, действительно ли есть ошибки, которые лучше обрабатываются этим методом по сравнению с упомянутыми выше, поэтому я оставляю вопрос открытым.

Причины, по которым я предпочитаю этот подход к другим, упомянутым в ответе lazerscience, - это то, что он может быть настроен только в режиме просмотра и не требует установки промежуточного программного обеспечения. С другой стороны, использование сигнала request_finished не позволит мне получить доступ к объекту ответа.

Ответ 2

Я предполагаю, что, говоря о промежуточном программном обеспечении, вы думаете о методе промежуточного программного обеспечения process_request, но там также process_response method, который называется когда возвращается объект HttpResponse. Я предполагаю, что это будет последний момент, когда вы можете найти крюк, который вы можете использовать.

Кроме того, также запускается request_finished signal.