Django:HTTP 状态 400 响应回滚模型保存?
Django: HTTP status 400 response rolls back model save?
我有一个 API 端点来触发对第三方的支付请求。使用 POST 请求中的一些数据调用端点,并类似于下面的代码。
不知何故,当支付请求失败时(payment.is_successful = False
),没有数据被保存到数据库中,尽管调试日志显示正在进行 SQL 插入,并且没有抛出任何错误。数据只是悄无声息地下降了。
我没有将数据库设置为使用 ATOMIC_REQUESTS
(我正在使用 postgreSQL)。我正在使用 django 1.11.5 和 DRF 3.6.3。
我认为如果我将 HTTP_400_BAD_REQUEST
更改为 HTTP_200_OK
,那么我的数据就会被保存。
- 为什么会发生这种情况(负责的代码在哪里)?
- 有没有办法通过 Django/DRF 中的一些设置来防止它发生(我希望我的数据在数据库中用于此视图,无论如何)?
- 我暂时把return代码设置为200,但是感觉不对,请求居然失败了。什么代码更有意义,不会导致数据消失?
查看代码
ser = MySerializer(data=request.data)
if ser.is_valid():
payment = ser.save()
else:
# do some non database stuff
return Response(result, status=status.HTTP_400_BAD_REQUEST)
if payment.is_successful:
# some more processing
return Response({'success': True}, status=status.HTTP_201_CREATED)
else:
return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) ## THIS LINE ##
序列化器代码
class MySerializer(serializers.ModelSerializer):
def create(...):
# call payment provider and process response
payment = MyPayment()
payment.save() # contains response from the provider that I always want to keep
return payment
DRF 不会回滚事务,除非它是 an exceptions and it meets some criteria。
看起来问题出在 Django REST 框架之外。
仔细检查您的中间件,如果出现非 200 错误,某些中间件可能会应用回滚。
我有一个 API 端点来触发对第三方的支付请求。使用 POST 请求中的一些数据调用端点,并类似于下面的代码。
不知何故,当支付请求失败时(payment.is_successful = False
),没有数据被保存到数据库中,尽管调试日志显示正在进行 SQL 插入,并且没有抛出任何错误。数据只是悄无声息地下降了。
我没有将数据库设置为使用 ATOMIC_REQUESTS
(我正在使用 postgreSQL)。我正在使用 django 1.11.5 和 DRF 3.6.3。
我认为如果我将 HTTP_400_BAD_REQUEST
更改为 HTTP_200_OK
,那么我的数据就会被保存。
- 为什么会发生这种情况(负责的代码在哪里)?
- 有没有办法通过 Django/DRF 中的一些设置来防止它发生(我希望我的数据在数据库中用于此视图,无论如何)?
- 我暂时把return代码设置为200,但是感觉不对,请求居然失败了。什么代码更有意义,不会导致数据消失?
查看代码
ser = MySerializer(data=request.data)
if ser.is_valid():
payment = ser.save()
else:
# do some non database stuff
return Response(result, status=status.HTTP_400_BAD_REQUEST)
if payment.is_successful:
# some more processing
return Response({'success': True}, status=status.HTTP_201_CREATED)
else:
return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) ## THIS LINE ##
序列化器代码
class MySerializer(serializers.ModelSerializer):
def create(...):
# call payment provider and process response
payment = MyPayment()
payment.save() # contains response from the provider that I always want to keep
return payment
DRF 不会回滚事务,除非它是 an exceptions and it meets some criteria。
看起来问题出在 Django REST 框架之外。
仔细检查您的中间件,如果出现非 200 错误,某些中间件可能会应用回滚。