首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在DRF中实施后幂等?

如何在DRF中实施后幂等?
EN

Stack Overflow用户
提问于 2017-06-01 22:25:40
回答 1查看 1.8K关注 0票数 5

我有一个使用Django Rest框架的API,我想保护它防止重复的POST请求(本着准确地贴一次(坡)的精神)。特别是,我想要处理的情况是:

  1. 客户端发送HTTP来创建对象。
  2. API后端创建对象并将其提交到数据库。
  3. 客户端失去网络连接。
  4. API后端试图返回一个成功的响应,但是由于客户端丢失了网络,所以无法这样做。
  5. 客户端永远得不到“成功”响应,因此假设请求失败。客户端重试请求,创建一个重复的对象。

对此在邮寄名单上进行了一些讨论,但没有实现任何代码。人们现在是如何解决这个问题的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-01 22:28:22

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

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
class MyViewSet(mixins.RetrieveModelMixin,
                mixins.UpdateModelMixin,
                mixins.ListModelMixin,
                viewsets.GenericViewSet):
    permission_classes = [permissions.IsAuthenticated,
                          IsIdempotent]
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44318042

复制
相关文章

相似问题

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