python - 在引发异常时重试 Django View 的最简单方法是什么?

标签 python django database exception transactions

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

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

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

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

最佳答案

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

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

并在 View 上使用它:

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

显然,这将无限期地重试,因此可以改进很多逻辑。您还可以编写装饰器来接受它想要查找的异常,这样您就可以根据 View 对其进行自定义。

关于python - 在引发异常时重试 Django View 的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207745/

相关文章:

python - Django 有没有办法知道网站是处于开发模式还是生产模式?

python - 让 django-registration 和 django-profile 一起工作

Django : How to exclude form field if the user is staff?

使用 MS Access 的 C# 参数化 OLEDB 查询

PHP如何列出所选月份的所有总收入

database - 使用sql将文件csv中的数据导入Oracle

python - 如何在 Windows 命令行中使用参数运行 Python 脚本

python - 将 imshow 与用户输入相结合

Python如何运行这个函数得到100个素数

mysql - Django 字符集和编码