2011-08-14 17 views
2

長すぎるHTTPリクエストがクライアントによって中止されると(ブラウザが閉じられているなど)、DjangoビューはIOError例外を発生させるようです。Djangoで中止されたHTTPリクエストを正しく処理する方法

私はただ無視したいと思ったら、そのような中止された要求を検出する適切な方法は何ですか? IOErrorを捕まえすぎると、他のIO問題を誤って無視する可能性があります。

答えて

1

それを行うための最善の方法は、IOExceptionがキャッチされている場合、レンダリングされたerrors/request_aborted.htmlテンプレートを言う、カスタムのHTTPレスポンスを返すようにprocess_exception()を実装するカスタムミドルウェアクラスを使用することです。

+0

しかし、他のIOErrorがスローされた場合、中止の結果ではなく、何らかの理由でどうなるでしょうか?私はそのエラーを抑制するでしょう... –

+0

これは捕らえられない例外のために働きます。あなたは通常、中止されたリクエストだけがキャッチされていないことを確認するためにIOを実行しているときに考えられるすべての例外をキャッチしようとします。 –

+0

しかし、IOErrorがどこから来るのかは分かりにくいです。例えば。私はrequest.POSTにアクセスするだけでそれが頻繁に発生するのを見ます。私はIOErrorがほぼすべてのフレームワーク関数によって引き上げられることを前提として、クライアントの切断を他のタイプのIOエラーと区別する方法が必要です。 –

0

IOErrorを無視する場合は、そのままにしてください。あなたはそれをキャッチする必要はありません。あなたが絶対捕まえなければならない場合は、@ FilipDupanovićが示唆したことを行うことができ、django.http.HttpResponseServerErrorを返して、500に応答コードを設定することができます。

+1

私はすべてのキャッチされていないエラーをログに記録し、ログノイズが発生するため、このメッセージを表示させたくありません。 –

2

ジャンゴ1.3では、最大、あなたはあなたに興味を持っていない例外を抑制するためにlogging filterクラスを使用することができますここで私は狭く_get_raw_post_data()から上げ例外IOError例外を抑制するために使用しているログフィルタクラスです:。

import sys, traceback 
class _SuppressUnreadablePost(object): 
    def filter(self, record): 
     _, exception, tb = sys.exc_info() 
     if isinstance(exception, IOError): 
      for _, _, function, _ in traceback.extract_tb(tb): 
       if function == '_get_raw_post_data': 
        return False 
     return True 

Django 1.4では、ほとんどの複雑さを排除し、新しい例外クラスUnreadablePostErrorを抑制することができます。 (this patchを参照)。

1

Ravenは今度はgot_request_exception()信号に接続し、処理されない例外をキャッチし、ログシステムを完全にバイパスして、dloweが提案した解決策はもう機能しなくなりました。

あなたが無視したいエラーでそれを設定するためのミドルウェアを使用できるようにカラスは、例外インスタンスにskip_sentry属性を探しただし:

import sys 
import traceback 


class FilterPostErrorsMiddleware(object): 
    """ 
    A middleware that prevents unreadable POST errors to reach Sentry. 
    """ 

    def process_exception(self, request, exception): 
     if isinstance(exception, IOError): 
      tb = sys.exc_info()[2] 
      for _, _, function, _ in traceback.extract_tb(tb): 
       if function == '_get_raw_post_data': 
        exception.skip_sentry = True 
        break 

:あなたは、最近のを使用する必要があります以前のバージョンではインスタンスではなく例外タイプのskip_sentry属性が誤ってチェックされていたようです。

関連する問題