我使用Django Rest框架APIview将用户添加到应用程序中。该APIview在创建用户时返回一个status_code 200,如果用户已经在应用程序上存在,则返回一个400。无论如何,apiview应该将执行的操作写入“events”表中:
Events.objects.create(action='user-registration', result='ok/ko', otherinfo='whatever')当POST请求视图返回响应中与200不同的状态代码时,DRF似乎被设计为对任何数据库操作进行回滚。
--它发生在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,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中?
发布于 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。
发布于 2022-07-15 20:41:13
@Colegatron,我知道已经一年了,但这让我省去了很多头痛。我相信,django-reversion版本pre 4.x确实存在问题。更新到v5.0.1,并将“不成功”请求中的DB操作持久化到DB。
https://stackoverflow.com/questions/66520851
复制相似问题