ATOMIC_REQUEST и транзакции в Django 1.6

Учитывая следующий код:

from django.db import transaction @transaction.atomic def viewfunc(request): # This code executes inside a transaction. do_stuff() 

Из моего понимания транзакций в Django 1.6, если do_stuff выбрасывает исключение, скажем IntegrityError, тогда транзакция будет отклонена вправо. Но поскольку сам Django вызывает представление, ничто не остановит IntegrityError от поднятия стека вызовов и вызывает ошибку HTTP 500 да? Предположим, что это не то, что мы хотим, так как мы хотим изящно обрабатывать эту ошибку, но все же получаем функциональность отката.

  • В Python, используя pyodbc, как выполнять транзакции?
  • Атомное приращение счетчика в джанго
  • Python GIL: блокировка django save ()?
  • Разрывает транзакции ndb.toplevel?
  • Поэтому я думаю, что очевидная мысль – это хорошо, не делайте этого, используйте transaction.atomic в качестве менеджера контекста, который завернут в try, кроме блока, например, здесь:

     try: with transaction.atomic(): generate_relationships() except IntegrityError: handle_exception() 

    Хорошо. Но тогда, если вы хотите использовать функцию Transaction per HTTP Request, установив ATOMIC_REQUEST = True в конфигурацию db, это означает, что django фактически просто добавит свойство transaction.atomic к вашему представлению, которое не поймает никаких исключений. Как ATOMIC_REQUEST даже полезен? Почему вы хотите, чтобы ваши ошибки в базе данных распространялись до пользователя?

    Так что мой вопрос.

    1. Что мне здесь не хватает, или мое понимание правильное?
    2. Если я правильно понимаю, что используется для использования ATOMIC_REQUEST? Должен ли я писать urls.hadler500 или мне нужно внедрить некоторое промежуточное ПО, чтобы поймать ошибки?

  • Передача переменной urlname в тег url в шаблоне django
  • ImportError: невозможно импортировать имя _imaging
  • Расширение профиля пользователя в Django. Создание пользователей пользователями
  • как сортировать по вычисленному значению в django
  • Общий объект между запросами в Django
  • Регистрация в Python в Django
  • One Solution collect form web for “ATOMIC_REQUEST и транзакции в Django 1.6”

    Ваше понимание верное. Что вам не хватает, так это то, что исключение из вашего кода просмотра (которое сильно отличается от «распространять весь путь до пользователя»), является совершенно нормальной задачей в Django.

    Вы можете настроить полученное поведение, создав шаблон 500.html , переопределив handler500 или создав собственное собственное промежуточное программное обеспечение. Во всех этих стандартных случаях использование ATOMIC_REQUESTS будет делать то, что вы хотите.

    Если вы хотите перехватывать исключения из своего кода просмотра и обрабатывать их специально, вы можете это сделать, вам просто нужно указать, как обрабатывать транзакции вручную. Использование ATOMIC_REQUESTS – это просто способ сохранить некоторые шаблоны для общего случая, позволяя вам самостоятельно настраивать поведение в необычном случае.

    Python - лучший язык программирования в мире.