ATOMIC_REQUEST y transacciones en Django 1.6

Dado el siguiente código:

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

Desde mi entendimiento de las transacciones en Django 1.6 si do_stuff lanza una excepción, digamos IntegrityError, entonces la transacción se revertirá a la derecha. Pero como Django está llamando a la vista, nada impedirá que IntegrityError se incremente en la stack de llamadas y cause un error HTTP 500, ¿sí? Supongamos que no es lo que queremos, ya que queremos manejar con gracia el error, pero aún así obtener la funcionalidad de reversión.

Así que supongo que el pensamiento obvio es bueno, no hagas eso, usa transaction.atomic como un administrador de contexto que está envuelto en un bash, excepto en un bloque como el ejemplo aquí:

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

Multa. Pero luego, si desea usar la función Transacción por solicitud HTTP, configure ATOMIC_REQUEST = Verdadero en su configuración de db, lo que significa que django en efecto solo agregará la decoración transaction.atomic a su vista, que no detectará ninguna excepción. ¿Por qué ATOMIC_REQUEST es incluso útil? ¿Por qué querría dejar que los errores de su base de datos se propaguen hasta el usuario?

Así que mi pregunta es.

  1. ¿Qué me estoy perdiendo aquí o mi entendimiento es correcto?
  2. Si estoy en lo cierto, ¿cuál es un caso de uso para usar ATOMIC_REQUEST? ¿Se espera que escriba un urls.hadler500 o debo implementar algún middleware para detectar los errores?

Su comprensión es correcta. Lo que te falta es que dejar que las excepciones se propaguen desde tu código de vista (que es muy diferente de “propagarse hasta el usuario”) es algo perfectamente normal en Django.

Puede personalizar el comportamiento resultante creando una plantilla 500.html , anulando handler500 o creando su propio middleware personalizado. En todos esos casos estándar, el uso de ATOMIC_REQUESTS hará lo que usted quiere que haga.

Si desea capturar excepciones en su código de vista y manejarlas especialmente, puede hacerlo, solo tendrá que especificar cómo manejar las transacciones manualmente. Usar ATOMIC_REQUESTS es solo una manera de guardar un poco de repetitivo para el caso común, mientras que le permite personalizar el comportamiento en el caso poco común.