如何在DRF中实现后幂等性?

2024-04-28 16:48:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用Django Rest框架的API,我想防止重复的POST请求(本着Post Exactly Once (POE)的精神)。尤其是,我要处理的情况是:

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

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


Tags: django框架restapi数据库客户端精神情况
1条回答
网友
1楼 · 发布于 2024-04-28 16:48:44

我通过添加对可由客户机设置的X-Idempotency-Keyhttp报头的支持来解决这个问题。然后,我使用自定义权限类检查非幂等请求:

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

我可以这样补充我的观点:

^{pr2}$

相关问题 更多 >