gpt4 book ai didi

python - 如何在 DRF 中强制执行 POST 幂等性?

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:17 24 4
gpt4 key购买 nike

我有一个使用 Django Rest Framework 的 API,我想防止重复的 POST 请求(本着 Post Once Exactly (POE) 的精神)。我尝试处理的具体场景是:

  1. 客户端发送 HTTP POST 来创建对象。
  2. API 后端创建对象并将其提交到数据库。
  3. 客户端失去网络连接。
  4. API 后端尝试发回成功响应,但无法执行所以因为客户失去了网络。
  5. 客户端永远不会得到“成功”响应,因此假设请求失败。客户端重试请求,创建一个副本对象。

关于这个有一些讨论on the mailing list但没有代码实现。人们现在是如何解决这个问题的?

最佳答案

我通过添加对可由客户端设置的 X-Idempotency-Key http header 的支持来解决此问题。然后我使用自定义权限类检查非幂等请求,该类检查最近是否看到幂等 key (在缓存中):

class IsIdempotent(permissions.BasePermission):
message = 'Duplicate request detected.'

def has_permission(self, request, view):
if request.method != 'POST':
return True
ival = request.META.get('HTTP_X_IDEMPOTENCY_KEY')
if ival is None:
return True
ival = ival[:128]
key = 'idemp-{}-{}'.format(request.user.pk, ival)
is_idempotent = bool(cache.add(key, 'yes',
settings.IDEMPOTENCY_TIMEOUT))
if not is_idempotent:
logger.info(u'Duplicate request (non-idempotent): %s', key)
return is_idempotent

我可以像这样添加到我的 View 中:

class MyViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
permission_classes = [permissions.IsAuthenticated,
IsIdempotent]

关于python - 如何在 DRF 中强制执行 POST 幂等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com