django - 如何确保 Django REST API 的幂等性?

标签 django rest api architecture idempotent

比如说,我正在构建一个基于 Django 的 REST API/DRF和 PostgreSQL。我希望所有 GETPUTDELETE 端点都遵循最佳实践并且幂等。我如何确保/验证这是真的?

最佳答案

我知道现在回答这个问题为时已晚,但我想为其他可能感兴趣的人回答这个问题。

默认情况下,GETDELETE 是幂等的,因为唯一可能的响应状态是 404 或发送数据,但不是 PUT 或者如果我们需要使任何 POST 请求幂等。对于 PUT,最常见的方式是验证输入数据。确保模型的所有字段(包括id)都被传入,除非客户端以这种方式收到400 bad request,因为即使传入了id,也没有人可以添加不需要的记录到数据库。另一种 100% 确保一切都是幂等的方法是,我们可以使用缓存将请求主体和用户 ID 作为哈希存储到缓存服务器中足够长的时间。像这样:

# in views.py
# for DRF

from django.core.cache import cache
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class IdempotentView(APIView):
     def put(self, req, pk, format=None):

         key = hash(f"{req.user.username}, {req.body},{pk}")
         is_cached = cache.get(key)

         if is_cached :
            return Response (req.body, status=status.HTTP_201_CREATED)
         
         # preform the view commands then:
         
         expiary  = 60*60*3 # 3 hours 
         cache.set(key, 'True' , exp_date)

         return Response (data, status=status.HTTP_201_CREATED)

关于django - 如何确保 Django REST API 的幂等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61634970/

相关文章:

django-tables2 列集

python - 向后关系如何与 Django 查询集配合使用

javax.ws.rs.WebApplicationException : javax. xml.bind.JAXBException 与链接异常类 [Ljava.lang.Object;

java - 我们需要传递哪些参数和 header 才能使用 REST API 连接到 Twitter?

Python 报告生成器

javascript - Github API - 获取 Angular2 中关注者的关注者

python - Django View 只渲染一页,不会渲染其余页面

rest - 为什么 google-oauth API 需要重定向 URL?

api - 我应该为外部服务设置哪个超时?

python - 在报告 405 之前检查有效的 url 以在 Django REST 框架中查看详细信息