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

在引发异常时重试Django视图的最简单方法是什么?,django,transaction-isolation,Django,Transaction Isolation,如果引发某个异常(在我的示例中,是底层数据库中的序列化错误),我希望重新运行Django视图函数。我希望它使用完全相同的参数运行,包括相同的request对象,就像客户端重新请求URL一样 视图中有许多数据库查询,其中任何一个都可能引发异常——单独重新运行其中一个查询是行不通的,因此我认为我需要将整个视图函数包装在try/except块和循环中,直到成功 但是我有几个视图函数可能会引发这样的异常,所以我想要一个通用的解决方案。我还希望能够重试一定次数,然后失败 有什么简单的解决方案吗?您可以通过

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

视图中有许多数据库查询,其中任何一个都可能引发异常——单独重新运行其中一个查询是行不通的,因此我认为我需要将整个视图函数包装在try/except块和循环中,直到成功

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


有什么简单的解决方案吗?

您可以通过编写装饰程序来实现这一点:

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")
显然,这将无限期地重试,因此许多逻辑可以在那里得到改进。您还可以编写decorator来接受它想要查找的异常,这样您就可以为每个视图定制它