在引发异常时重试Django视图的最简单方法是什么?

时间:2014-11-29 22:15:01

标签: django transaction-isolation

如果引发某个异常(在我的情况下是底层数据库中的序列化错误),我想重新运行Django视图函数。我希望它使用完全相同的参数运行,包括相同的request对象 - 就像客户端重新请求了URL一样。

视图中有许多数据库查询,并且可以在其中任何一个上引发异常 - 并且它不能单独重新运行其中一个查询,所以我认为我需要包装整个视图在try / except块中运行并循环直到成功。

但是我有几个可能引发这种异常的视图函数,所以我想要一个通用的解决方案。我也希望能够重试一定次数然后失败。

有没有简单的解决方案?

1 个答案:

答案 0 :(得分: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")

显然,这将无限期重试,因此可以在那里改进很多逻辑。您也可以编写装饰器来接受它想要注意的异常,这样您就可以根据视图对其进行自定义。