[英]How to enforce POST idempotency in DRF?
我有一個使用 Django Rest Framework 的 API,我想防止重復的POST
請求(本着Post Once Exactly (POE)的精神)。 特別是,我試圖處理的場景是:
我通過添加對可由客戶端設置的X-Idempotency-Key
http 標頭的支持解決了這個問題。 然后,我使用自定義權限類檢查非冪等請求,該類檢查最近是否已看到冪等鍵(在緩存中):
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
我可以像這樣添加到我的觀點中:
class MyViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
permission_classes = [permissions.IsAuthenticated,
IsIdempotent]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.