2010-11-30 20 views
13

私のDjangoアプリケーションでは、応答がクライアントに正常に送信されたかどうかを追跡したいと思います。私は、クライアントがレスポンスを受け取った(そして表示した)ことを保証するために、HTTPのようなコネクションレスプロトコルには「防水」方法がないことをよく承知しているため、これはミッションクリティカルな機能ではありませんが、最新の可能な時間。応答はHTMLではないので、クライアントからのコールバック(JavascriptやIMGタグなどを使用)は不可能です。応答がクライアントに送信された後にDjangoでコードを実行します

「最新の」フックは、ミドルウェアリストの最初の位置にprocess_responseを実装したカスタムミドルウェアを追加することですが、これは実際の応答が構築されてクライアントに送信される前に実行されることを理解しています。応答が正常に送信された後でDjangoにコードを実行するフック/イベントがありますか?

答えて

14

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シグナルを使用すると、応答オブジェクトにアクセスできなくなります。

+0

シンプルなjsonフラグを送信すると何が問題になりますか?なぜ上のすべての? –

+0

"json flag"の意味もわかりません。また、JSONが私の問題を手助けする方法もありません...詳細を教えてください。 –

+6

成功した応答を処理するにはうまくいきますが、ユーザーが接続を中断した場合(タブを閉じるか "停止"ボタンを押す)、close()は実行されません。接続が強制的に中断されたとしても、応答が処理された後に何か必要があれば、\ __ del \ __メソッドを定義してください。 – vincent

1

ミドルウェアについて話すとき、私はあなたがミドルウェアのprocess_request方法を考えていると仮定しますが、HttpResponseオブジェクトが返されたときに呼び出されprocess_response methodもあります。私はそれがあなたが使うことができるフックを見つけることができる最新の瞬間になると思います。

さらに、解雇されているrequest_finished signalもあります。私は、現時点では用のつもりだ方法は、のHttpResponseのサブクラスを使用しています

+0

私はprocess_responseを知っていましたが、このメソッドは応答を返すと予想されていますので、この時点で応答を送信できなかったと思います。 request_finishedは有望に見えますが、私はそれを今見ています。 –

+0

私はrequest_finishedをチェックしましたが、残念ながら要求が処理されたときに例外があっても実行されます。成功した回答だけを追跡したいので、これは私の目的にとっても役に立たない。 –

+1

HttpRequestが完全に構築された後に呼び出され、その後にWebサーバーに処理されるため、process_responseよりも後のほうが見つからないと思います... –

関連する問題