为什么 Django REST API 装饰器破坏了 Django non_atomic_requests 装饰器?
Why are Django REST API decorators breaking the Django non_atomic_requests decorator?
我有一个 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_something1
和 2
之前和之后创建保存点 - 但重要的是 离开 with 块后不提交。
整个视图仍然包含在 BEING
中,并且 COMMIT
仅在视图末尾发布到数据库。
如果我将 @transaction.non_atomic_requests
装饰器移动到装饰器列表的开头,那么我会得到正确的行为,每个 with
块都在其自己的事务中并在末尾提交。
这是怎么回事?
api_view
在后台创建一个 APIView。
根据调用 transaction.non_atomic_requests
的位置,它可能会被添加到错误的函数中(例如 as_view
而不是 myview
。
文档可能需要更新以强调它。我不记得已经报道过了。
我有一个 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_something1
和 2
之前和之后创建保存点 - 但重要的是 离开 with 块后不提交。
整个视图仍然包含在 BEING
中,并且 COMMIT
仅在视图末尾发布到数据库。
如果我将 @transaction.non_atomic_requests
装饰器移动到装饰器列表的开头,那么我会得到正确的行为,每个 with
块都在其自己的事务中并在末尾提交。
这是怎么回事?
api_view
在后台创建一个 APIView。
根据调用 transaction.non_atomic_requests
的位置,它可能会被添加到错误的函数中(例如 as_view
而不是 myview
。
文档可能需要更新以强调它。我不记得已经报道过了。