如果引发某个异常(在我的情况下是底层数据库中的序列化错误),我想重新运行Django视图函数。我希望它使用完全相同的参数运行,包括相同的request
对象 - 就像客户端重新请求了URL一样。
视图中有许多数据库查询,并且可以在其中任何一个上引发异常 - 并且它不能单独重新运行其中一个查询,所以我认为我需要包装整个视图在try / except块中运行并循环直到成功。
但是我有几个可能引发这种异常的视图函数,所以我想要一个通用的解决方案。我也希望能够重试一定次数然后失败。
有没有简单的解决方案?
答案 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")
显然,这将无限期重试,因此可以在那里改进很多逻辑。您也可以编写装饰器来接受它想要注意的异常,这样您就可以根据视图对其进行自定义。