对于提取数据,建议通常使用GET
并提交表单POST
。以下函数如何“检出”项目:
@validate_credentials
@csrf_exempt
@acceptable_methods(???)
def cue_checkout(request, cue_id, user=None, checkout=True):
cue = Cue.objects.filter(pk=cue_id, user=user)
if not cue.exists():
return HttpResponseForbidden('Invalid Cue supplied.')
cue = cue[0]
CueAssignment.objects.create(cue=cue, user=user, checkout_timestamp=timezone.now())
return HttpResponse()
我在想,因为我们正在修改数据,它应该是POST
,但有人可以解释一下这里的正确方法是什么以及为什么?
答案 0 :(得分:2)
W3指定了两个用于描述HTTP方法的术语。
第一个是" Safe"这意味着它不会改变服务器上的数据资源。
第二个是"幂等",这意味着只要数据资源的状态没有改变(与幂等请求无关),请求的结果应该是相同的。
因为您在服务器上创建对象,所以您应该使用POST
,因为GET
被定义为安全且幂等的操作。 POST
同时既不安全也不是幂等(因为我们可能因为约束而拒绝创建对象)。此外,您应该强制执行csrf_protection以避免重用会话cookie,从而保持用户的权限可以自由地用于创建对象。
有一个很好的快速表here用作常用方法的快速参考。
答案 1 :(得分:1)
您可以考虑将项目签出为更新某些资源,例如一辆车。因此,在这种情况下,POST
或PUT
最有意义。
POST
用于修改资源或创建资源。当资源的标识符尚未知道时,使用POST
创建资源,例如在创建时,服务器将确定资源的id。
<强>修改强>
POST /my/resource/[existing-id]
- 修改已知位置的资源
创建强>
POST /my/resource
- 通过此操作,您可能会返回201,其中包含标识新资源的位置标头
PUT
用于创建资源或覆盖它。在这两种情况下,资源ID都是已知且完全合格的。
创建强>
PUT /my/resource/[id]
- 在已知位置创建资源
<强>修改强>
PUT /my/resource/[existing-id]
- 更新已知位置的资源
<强>差异:强>
PUT
是幂等的。多次调用它总会产生相同的结果
POST
不是幂等的。多次调用它可能会产生多个新资源。