为啥 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_something1
和 2
之前和之后创建了保存点 - 但关键是在离开 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 装饰器?的主要内容,如果未能解决你的问题,请参考以下文章
在 api 视图方法上禁用 CSRF(django rest 框架)
如何修复在 Django Rest Framework 中使用 REST API 登录时出现的 CSRF 错误?