如何解决Django rest 框架避免状态回滚!=200 个响应
发现:django-reversion 包干扰把我逼疯了。将在他们的 github 上打开一个问题。只需禁用即可解决此问题
我使用 Django Rest Framework APIview 将用户添加到应用程序中。 该 APIview 在创建用户时返回 status_code 200,如果用户已存在于应用程序中,则返回 400。 在任何情况下,apiview 都应该将执行的操作写入“事件”表:
Events.objects.create(action='user-registration',result='ok/ko',otherinfo='whatever')
似乎 DRF 旨在在 POST 请求视图在响应中返回与 200 不同的状态代码时回滚到任何数据库操作。
它发生在 POST 请求中,但不在 GET 中!!
class register_user(APIview):
# This saves the event
def get(self,request):
Events.object.create(action='register-user',result='fail',otherinfo='forced fail')
return JsonResponse(status=400,data={'status': 'ko','data':'forced fail'})
# This does not saves the event
def post(self,'data':'forced fail'})
即使响应是 status_code=400,我怎样才能确保事件持久化到数据库中?
解决方法
如果 ATOMIC_REQUESTS
标志在您的 Django 数据库设置中设置为 True,则 DRF 将在状态代码失败的情况下进行回滚。此 PR 基于 ATOMIC_REQUESTS
标志 https://github.com/encode/django-rest-framework/pull/2887/files 向 DRF 引入了回滚功能。
如果您不希望发生这种情况,可以将标志设置为 False
并可以显式处理原子请求。
另一种方法是编写一个装饰器,它可以将视图的 ATOMIC_REQUESTS
设置为 False
。 Django 已经有一个装饰器,但不确定它是否适用于 DRF https://docs.djangoproject.com/en/3.2/topics/db/transactions/#django.db.transaction.non_atomic_requests
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。