Каков самый простой способ повторить представление Django при возникновении исключения?
Я хочу повторно запустить функцию представления Django, если возникает определенное исключение (в моем случае ошибка сериализации в базовой базе данных). Я хочу, чтобы он работал с точно такими же параметрами, включая тот же Объект request
, как если бы клиент повторно запросил URL.
В представлении есть много запросов к базе данных, и исключение может быть вызвано для любого из них - и это не будет работать, чтобы повторно запустить только один из запросов в изоляции, поэтому я думаю, что мне нужно обернуть всю функцию представления в блоке try / except и цикле до достижения успеха.
Но у меня есть несколько функций представления, которые могут вызывать такие исключения, поэтому я хочу общее решение. Я также хочу иметь возможность повторить попытку до определенного количества раз, а затем потерпеть неудачу.
Есть ли какое-нибудь простое решение?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")