2014-11-29 2 views
3

Я хочу повторно запустить функцию представления Django, если возникает определенное исключение (в моем случае ошибка сериализации в базовой базе данных). Я хочу, чтобы он работал с точно такими же параметрами, включая тот же объект request - как если бы клиент повторно запросил URL.Каков самый простой способ повторить представление Django при поднятии исключения?

В представлении есть много запросов к базе данных, и исключение может быть поднято на любом из них - и это не сработает, чтобы повторно запустить только один из запросов отдельно, поэтому я думаю, что мне нужно обернуть весь функция просмотра в блоке try/except и loop до достижения успеха.

Но у меня есть несколько функций просмотра, которые могут вызвать такие исключения, поэтому я хочу использовать общее решение. Я также хочу, чтобы у меня было возможность повторить попытку до определенного количества раз, а затем потерпеть неудачу.

Есть ли какое-нибудь простое решение?

ответ

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

Очевидно, что это будет повторять до бесконечности, так много логики можно было бы улучшить там , Вы также можете написать декоратору, чтобы принять исключения, на которые он хочет обратить внимание, поэтому вы можете настроить его для каждого вида.

Смежные вопросы