【问题标题】:Why are Django REST API decorators breaking the Django non_atomic_requests decorator?为什么 Django REST API 装饰器会破坏 Django non_atomic_requests 装饰器?
【发布时间】:2018-02-08 20:04:47
【问题描述】:

我有一个这样的 Python Django REST API 视图:

from rest_framework.decorators import api_view, permission_classes
from django.db import transaction

@api_view( [ 'POST' ] )
@permission_classes( ( IsAuthenticated, ) )
@transaction.non_atomic_requests
def myview( request ):
    with transaction.atomic():
        db_do_something1()

    with transaction.atomic():
        do_do_something2()

    return some_response

在这种情况下,SQL 实际上针对我的 PostgreSQL 数据库运行,在 db_do_something12 之前和之后创建了保存点 - 但关键是在离开 with 块后不提交

整个视图仍然包裹在BEING 中,COMMIT 仅在视图结束时发送到数据库。

如果我将 @transaction.non_atomic_requests 装饰器移动到装饰器列表的开头,那么我会得到正确的行为,每个 with 块都在自己的事务中并在最后提交。

这是怎么回事?

【问题讨论】:

    标签: django python-2.7 postgresql django-rest-framework django-orm


    【解决方案1】:

    api_view 在后台创建一个 APIView。 根据调用transaction.non_atomic_requests 的位置,它可能被添加到错误的函数中(例如as_view 而不是myview

    文档可能需要更新以强调它。我不记得已经报道过了。

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2015-11-18
      • 2021-07-25
      • 2015-01-18
      • 2019-02-08
      • 2013-07-24
      • 1970-01-01
      • 2019-04-21
      • 2011-02-06
      相关资源
      最近更新 更多