3

特定の例外が発生した場合 (私の場合は、基になるデータベースのシリアル化エラー)、Django ビュー関数を再実行したいと考えています。requestクライアントが URL を再要求したかのように、同じオブジェクトを含め、まったく同じパラメーターで実行したいと考えています。

ビューには多くのデータベースクエリがあり、それらのいずれかで例外が発生する可能性があります-クエリの1つだけを分離して再実行することはできません。そのため、ビュー関数全体をtry/except ブロックとループを成功するまで繰り返します。

しかし、そのような例外を発生させる可能性のあるビュー関数がいくつかあるので、一般的な解決策が必要です。また、特定の回数まで再試行してから失敗できるようにしたいと考えています。

簡単な解決策はありますか?

4

1 に答える 1

4

デコレータを書くことでこれを達成できます:

def retry_on_exception(view):
    def wrapper(*args, **kwargs):
        while True:
            try:
                return view(*args, **kwargs):
            except (TheExceptions, IWant, ToCatch):
                pass
    return wrapper

ビューでこれを使用します。

@retry_on_exception
def my_view(request, foo, bar):
    return HttpResponse("My stuff")

明らかに、これは無期限に再試行されるため、多くのロジックが改善される可能性があります。また、注意したい例外を受け入れるようにデコレーターを作成して、ビューごとにカスタマイズできるようにすることもできます。

于 2014-11-29T23:32:06.057 に答える