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

8 投票
3 回答
27974 浏览
提问于 2025-04-18 03:04

我正在尝试向一个非常简单的Django服务器发送一个简单的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 个回答

1

你应该把请求头中的'Content-type'去掉,使用默认的类型,也就是'multipart/form-data'

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

如果你把'content_type'这一行取消注释,数据就只会在请求的主体部分(request.body)中出现。

2

在请求的头部指定一个用户代理(user-agent),可以让Django正确理解请求体中的原始数据,并正确填充POST字典。下面的代码应该可以正常工作:

payload = {'test': 'test'}
url = "http://localhost:8000"
headers = {'User-Agent': 'Mozilla/5.0'}
requests.post(url, data=payload, headers=headers)
11

这个 POST 字典里只包含了请求体中发送的表单编码数据。body 属性则包含了请求的原始内容,以字符串的形式呈现。因为你发送的是 JSON 编码的数据,所以它只会出现在原始的 body 属性里,而不会出现在 POST 里。

想了解更多信息,可以查看 文档

如果你尝试使用表单编码的数据,你应该能在 POST 字典中看到这些值:

payload = {'test':'test'}
url = "localhost:8000"
requests.post(url, data=payload)

撰写回答