Django:'WSGIRequest'对象没有属性'PUT'

时间:2015-12-01 16:02:12

标签: python django python-2.7 django-views

def my_view(request, someid=None):
    if request.method == 'GET':
        # do stuff
        return HttpResponse({})

    elif request.method == 'PUT':
        print request.body
        print request.PUT

        print json.loads(request.body)

        return HttpResponse({})

这是我的观点,我正在发出PUT请求(使用Postman-an api模拟器) x-www-form-urlencode

当我request.body时,它会以a=1&b=2&c=3的形式打印我发送的所有数据。因此,当我执行json.loads(request.body)时,会引发值错误no json object could be decoded。这是可以理解的。 json.loads需要一个json数据。

但是当我打印request.PUT时,它会显示object has no attribute PUT。我们通常会request.GETrequest.POST,对吗?但为什么不'PUT'?。

所以我有两个问题 -

1)如何将此request.body格式转换为python字典?

2为什么我无法打印request.PUT

我甚至在'PUT'区块中尝试了request.POST,但它是空的。

这里有类似的问题 ValueError: No JSON object could be decoded - Django request.body

但它不完全相同,这可能会在POST块中出现问题。

除此之外,我需要request.body,我不想手动提取像

这样的字段
put = QueryDict(request.body)
description = put.get('description')
...

有许多领域,所以我不能这样做。

1 个答案:

答案 0 :(得分:2)

试试这个

from django.http import QueryDict
qd = QueryDict(request.body)
put_dict = {k: v[0] if len(v)==1 else v for k, v in qd.lists()}

。     现在您可以通过**put_dict

直接更新对象了

OR

一个班轮

put_dict = {k: v[0] if len(v)==1 else v for k, v in QueryDict(request.body).lists()}