レスポンスがクライアントに送信された後にDjangoでコードを実行する 質問する

レスポンスがクライアントに送信された後に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 シグナルを使用すると、応答オブジェクトにアクセスできなくなります。

おすすめ記事