为啥 Django REST API 装饰器会破坏 Django non_atomic_requests 装饰器?

Posted

技术标签:

【中文标题】为啥 Django REST API 装饰器会破坏 Django non_atomic_requests 装饰器?【英文标题】: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 块都在自己的事务中并在最后提交。

这是怎么回事?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于为啥 Django REST API 装饰器会破坏 Django non_atomic_requests 装饰器?的主要内容,如果未能解决你的问题,请参考以下文章

Django rest 框架 api_view 与普通视图

Django REST框架--关系和超链接api

在 api 视图方法上禁用 CSRF(django rest 框架)

如何修复在 Django Rest Framework 中使用 REST API 登录时出现的 CSRF 错误?

为啥我的 Django REST Framework 视图集 URL 没有解析?

Django Rest:为啥访问被拒绝,尽管 AccessAny 被设置为权限?