首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django rest框架避免在status!=200响应上回滚

Django rest框架避免在status!=200响应上回滚
EN

Stack Overflow用户
提问于 2021-03-07 20:02:50
回答 2查看 470关注 0票数 0

我使用Django Rest框架APIview将用户添加到应用程序中。该APIview在创建用户时返回一个status_code 200,如果用户已经在应用程序上存在,则返回一个400。无论如何,apiview应该将执行的操作写入“events”表中:

代码语言:javascript
复制
Events.objects.create(action='user-registration', result='ok/ko', otherinfo='whatever')

POST请求视图返回响应中与200不同的状态代码时,DRF似乎被设计为对任何数据库操作进行回滚。

--它发生在POST请求上,而不是在GET!!中!

代码语言:javascript
复制
    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,request):
        Events.object.create(action='register-user',result='fail',otherinfo='forced fail')
        return JsonResponse(status=400, data={'status': 'ko','data':'forced fail'})

即使响应是status_code=400,我如何确保事件被持久化到db中?

EN

回答 2

Stack Overflow用户

发布于 2021-03-08 13:00:55

如果在Django数据库设置中将ATOMIC_REQUESTS标志设置为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

票数 1
EN

Stack Overflow用户

发布于 2022-07-15 20:41:13

@Colegatron,我知道已经一年了,但这让我省去了很多头痛。我相信,django-reversion版本pre 4.x确实存在问题。更新到v5.0.1,并将“不成功”请求中的DB操作持久化到DB。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66520851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档