Django无法访问raw_post_data

19 投票
1 回答
18095 浏览
提问于 2025-04-17 22:03

我在使用Django的时候遇到了一些奇怪的事情,这里是我的views.py文件:

def api(request):
    return HttpResponse("%s %s" % (request.method,request.raw_post_data))

现在我用POSTMAN(一个谷歌浏览器的小应用)发起一个HTTP POST请求。

我在POSTMAN里设置了一个POST请求,并在原始字段中填入'test'。

但是Django给我返回了三种不同的结果(都是随机的):

有时候Django返回'GET',有时候什么都不返回,有时候返回:

AttributeError at /
'WSGIRequest' object has no attribute 'raw_post_data'
Request Method: GET
Request URL:    https://api.mywebsiteurl.com/
Django Version: 1.6.2
Exception Type: AttributeError
Exception Value:    
'WSGIRequest' object has no attribute 'raw_post_data'
Exception Location: /home/spice_dj/spice/views.py in api, line 17
Python Executable:  /usr/bin/python
Python Version: 2.7.3
Python Path:    
['/usr/local/lib/python2.7/dist-packages/South-0.8.4-py2.7.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/home/spice_dj']
Server time:    Wed, 12 Mar 2014 22:51:11 -0400
  1. 为什么Django在我明确发起POST请求的时候却返回'GET'?

  2. 为什么会出现那个错误?

  3. 为什么没有返回我在原始字段中设置的'test'?

1 个回答

43

根据django 1.6 的弃用时间表

在1.4版本中,HttpRequest.raw_post_data这个属性被改名为HttpRequest.body。以后将不再支持旧的名字——HttpRequest.raw_post_data将不再有效。

这个改动的原因在相关的讨论中有说明:

request.raw_post_data这个名字不好。它和POST没有特别的关系,它只是HTTP请求的主体。这让用户感到困惑,还让人觉得Django不懂HTTP的工作原理。我们应该把名字改成request.body,并开始弃用旧的名称。

使用request.body

def api(request):
    return HttpResponse("%s %s" % (request.method, request.body))

希望这能帮到你。

撰写回答