Django - 在PUT/DELETE请求中存储的params在哪里?

Cyr*_* N. 53 django parameters rest

我想跟随我的新django项目的RESTful模式,并且我想知道在发出PUT/DELETE请求时参数的位置.

据我所知,我只在请求中看到GET和POST QueryDict,没有其​​他人.Django是否在请求中添加了新的PUT或DELETE QueryDict,还是将参数添加到GET或POST QueryDict?

谢谢你的帮助.

小智 87

我正在使用django v1.5.我主要使用QueryDict来解决问题:

from django.http import QueryDict
put = QueryDict(request.body)
description = put.get('description')
Run Code Online (Sandbox Code Playgroud)

在*.coffee中

$.ajax
      url: "/policy/#{policyId}/description/"
      type: "PUT"
      data:
        description: value
      success: (data) ->
        alert data.body
      fail: (data) ->
        alert "fail"
Run Code Online (Sandbox Code Playgroud)

您可以到这里查找更多信息.我希望这可以帮到你.祝好运:)

  • 对于现代版本的Django,这比接受的答案更有帮助. (4认同)
  • django 有点蹩脚,我们仍然必须在 2017 年使用这种解决方法。任何像样的 Web 框架都应该嵌入这样的支持...... (2认同)

小智 39

我假设你问的是你是否可以有这样的方法:

def restaction(request, id):
    if request.method == "PUT":
        someparam = request.PUT["somekey"]
Run Code Online (Sandbox Code Playgroud)

答案是否定的,你不能.Django没有为PUT,OPTIONS和DELETE请求构建这样的字典,这里解释了推理.

为了总结一下,REST的概念是,您交换的数据可能比简单的键值映射要复杂得多.例如,PUTting图像,或使用json.框架无法知道您可能想要发送数据的多种方式,因此它做了显而易见的事情 - 让您处理这一点.另请参阅此问题的答案,其中给出了相同的答案.

现在,您在哪里找到数据?那么,根据文档,django 1.2的特点request.raw_post_data.作为一个抬头,它看起来像django 1.3将支持 request.read()即文件般的语义.

  • 从Django 1.4开始,request.raw_post_data已重命名为request.body,而raw_post_data在Django 1.6中已被删除。 (2认同)

Art*_*ert 12

Ninefiger的回答是正确的.但是,有一些解决方法.

如果您正在为Django项目编写REST样式API,我强烈建议您使用tastypie.您将节省大量时间并保证API的结构更加结构化.您还可以查看tastypie是如何做到的(访问PUT和DELETE数据).


Eug*_*lev 7

有一个问题,我无法解决如何从request. QueryDict(request.body)没有帮助我。

所以,我找到了适合我的解决方案。我开始使用这个:

from django.http.multipartparser import MultiPartParser

您可以从以下位置获取数据request

MultiPartParser(request.META, request, request.upload_handlers).parse()
Run Code Online (Sandbox Code Playgroud)


Tom*_*tie 5

您可以在django-piston的代码中看到为PUT方法获取QueryDict的示例(请参阅coerce_put_post方法)