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错误是吗? 让我们假设这不是我们想要的,因为我们要优雅地处理错误,但仍然获得回滚功能。

所以我猜想明显的想法是好的,不要那样做,使用transaction.atomic作为上下文管理器,这个上下文管理器被封装在一个try块中,就像这里的例子:

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

精细。 但是,如果你想通过在你的数据库配置中设置ATOMIC_REQUEST = True来使用Transaction per HTTP Request功能,这意味着django实际上只需将transaction.atomic装饰添加到你的视图中,这将不会捕获任何异常。 ATOMIC_REQUEST如何有用? 为什么你会想让数据库错误一直传播到用户?

所以我的问题是。

  • 我在这里错过了什么,或者我的理解是否正确?
  • 如果我是正确的,那么使用ATOMIC_REQUEST的用例是什么? 我是否期望写一个urls.hadler500或者我应该实现一些中间件来捕获错误?

  • 你的理解是正确的。 你所缺少的是让异常从你的视图代码中传播出来(这与“一直传播给用户”是完全不同的),这在Django中是非常正常的事情。

    您可以通过制作500.html模板,重写handler500或创建自己的自定义中间件来自定义结果行为。 在所有这些标准情况下,使用ATOMIC_REQUESTS都会做你想做的事情。

    如果你想在你的视图代码中捕捉异常并专门处理它们,你当然可以这样做,你只需指定如何手动处理事务。 使用ATOMIC_REQUESTS只是为常见情况保存一些样板文件的一种方法,同时允许您在非常见情况下ATOMIC_REQUESTS定制行为。

    链接地址: http://www.djcxy.com/p/76173.html

    上一篇: REQUEST and Transactions in Django 1.6

    下一篇: Stack Overflow