Django中的异常处理和原子请求

时间:2016-11-25 19:53:37

标签: django exception-handling transactions

我之前a similar questio n,但我说错了,这就是为什么需要在新帖子中澄清它。

考虑以下Django设置和视图:

settings.py

DATABASES = {
    'default': {
        # ...
        'ATOMIC_REQUESTS': True,
    },

视图:

def my_view(request):
    foo = Foo.objects.get(id = 1)
    foo.some_field = 'new value'
    foo.save()
    if some_condition(): 
       # ...
    else:
      return JsonResponse(json.dumps('Cusom message', ensure_ascii=False), 
                          status = 500, 
                          safe = False)

此代码的问题是如果foo不正确,some_condition对象会更新,而我希望事务回滚,因为我发送状态500.有人能给我一个暗示我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

扩展@ Daniel的评论,以下是使用自定义原子块的方法:

from django.db import transaction


def my_view(request):
    try:
        with transaction.atomic():
            foo = Foo.objects.get(id = 1)
            foo.some_field = 'new value'
            foo.save()
            if not some_condition():
                raise Exception('This exception is to force rollback')
            # ...
    except Exception:
      return JsonResponse(json.dumps('Cusom message', ensure_ascii=False), 
                          status = 500, 
                          safe = False)

所以这里的诀窍是如果with transaction.atomic()块由于异常而退出,那么在该事务块中执行的任何语句都会被回滚。我们在with块之外捕获异常,以便我们可以将500响应发送回调用者。