【问题标题】:What is the simplest way to retry a Django view upon an exception being raised?在引发异常时重试 Django 视图的最简单方法是什么?
【发布时间】:2014-11-29 22:15:00
【问题描述】:

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

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

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

有什么简单的解决办法吗?

【问题讨论】:

    标签: django transaction-isolation


    【解决方案1】:

    您可以通过编写装饰器来实现:

    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")
    

    显然,这将无限期地重试,因此可以改进很多逻辑。你也可以编写装饰器来接受它想要寻找的异常,这样你就可以为每个视图自定义它。

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 2018-01-03
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多