Python使用requests库向Django发送Post请求数据

8
我将翻译以下内容,涉及到IT技术。请注意,为了保留HTML标签,您将只会看到翻译文本,而不是HTML代码。
我正试图向一个非常简单的Django服务器发送一个简单的POST请求,但是我无法理解为什么POST数据没有出现在请求的POST字典中,而是出现在请求体中。
客户端代码:
    payload = {'test':'test'}
    headers = {'Content-type': 'application/json','Accept': 'text/plain'}
    url = "localhost:8000"
    print json.dumps(payload)
    r = requests.post(url,data=json.dumps(payload),headers=headers)

服务器代码:

def submit_test(request):
    if request.method == 'POST':
          print 'Post: "%s"' % request.POST
          print 'Body: "%s"' % request.body
          return HttpResponse('')

服务器上打印出的内容是:
Post: "<QueryDict: {}>"
Body: "{"test": "test"}"

我玩过标题并将数据发送为纯字典,但似乎都不起作用。有什么想法?谢谢!
3个回答

11
POST 字典仅包含发送请求正文中的表单编码数据。而 body 属性包含作为字符串的请求原始正文。由于您正在发送 JSON 编码的数据,因此它只会显示在原始的 body 属性中,而不是 POST 中。
请参阅 文档 以获取更多信息。
尝试使用表单编码数据,您也应该可以在 POST 字典中看到相应的值。
payload = {'test':'test'}
url = "localhost:8000"
requests.post(url, data=payload)

1
我尝试过了,但是它给我的结果都是一样的。直接从正文中读取并进行处理有什么明显的问题吗?谢谢! - Ryan
1
如果您正在通过JSON与服务器通信,我认为从body属性中读取内容是规范的方法。这是我过去所做的。 :) - Nick Rempel

2
在请求头中指定用户代理应该可以使Django解释请求体的原始数据,并正确填充POST字典。以下代码应该可以正常工作:
payload = {'test': 'test'}
url = "http://localhost:8000"
headers = {'User-Agent': 'Mozilla/5.0'}
requests.post(url, data=payload, headers=headers)

我知道这个评论有点晚了,但这应该是正确的解决方案,因为那是唯一可行的方法! - Rafael

1

您应该从头部中删除“Content-type”,并使用默认值“multipart/form-data”

response = client.post(
    '/some_url/',
    data={'post_key': 'some_value'},
    # content_type='application/json'
)

如果您取消注释“content_type”,数据将仅在请求体中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接