使用Django发送Python requests的Post请求数据
我正在尝试向一个非常简单的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)