長すぎるHTTPリクエストがクライアントによって中止されると(ブラウザが閉じられているなど)、DjangoビューはIOError例外を発生させるようです。Djangoで中止されたHTTPリクエストを正しく処理する方法
私はただ無視したいと思ったら、そのような中止された要求を検出する適切な方法は何ですか? IOErrorを捕まえすぎると、他のIO問題を誤って無視する可能性があります。
長すぎるHTTPリクエストがクライアントによって中止されると(ブラウザが閉じられているなど)、DjangoビューはIOError例外を発生させるようです。Djangoで中止されたHTTPリクエストを正しく処理する方法
私はただ無視したいと思ったら、そのような中止された要求を検出する適切な方法は何ですか? IOErrorを捕まえすぎると、他のIO問題を誤って無視する可能性があります。
それを行うための最善の方法は、IOException
がキャッチされている場合、レンダリングされたerrors/request_aborted.html
テンプレートを言う、カスタムのHTTPレスポンスを返すようにprocess_exception()
を実装するカスタムミドルウェアクラスを使用することです。
IOError
を無視する場合は、そのままにしてください。あなたはそれをキャッチする必要はありません。あなたが絶対捕まえなければならない場合は、@ FilipDupanovićが示唆したことを行うことができ、django.http.HttpResponseServerError
を返して、500
に応答コードを設定することができます。
私はすべてのキャッチされていないエラーをログに記録し、ログノイズが発生するため、このメッセージを表示させたくありません。 –
ジャンゴ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を参照)。
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
属性が誤ってチェックされていたようです。
しかし、他のIOErrorがスローされた場合、中止の結果ではなく、何らかの理由でどうなるでしょうか?私はそのエラーを抑制するでしょう... –
これは捕らえられない例外のために働きます。あなたは通常、中止されたリクエストだけがキャッチされていないことを確認するためにIOを実行しているときに考えられるすべての例外をキャッチしようとします。 –
しかし、IOErrorがどこから来るのかは分かりにくいです。例えば。私はrequest.POSTにアクセスするだけでそれが頻繁に発生するのを見ます。私はIOErrorがほぼすべてのフレームワーク関数によって引き上げられることを前提として、クライアントの切断を他のタイプのIOエラーと区別する方法が必要です。 –