关于python:Django Rest Framework:空的request.data

Django Rest Framework: empty request.data

对于DRF,我有以下代码:

1
2
3
4
5
6
7
from rest_framework import viewsets

class MyViewSet(viewsets.ViewSet):

    def update(self, request, pk = None):
        print pk
        print request.data

我以以下方式通过python-requests调用URL:

1
2
3
4
import requests
payload = {"foo":"bar"}
headers = {'Content-type': 'application/json'}
r = requests.put("https://.../myPk", data= payload, headers=headers)

但是从服务器接收到请求时,request.data为空。这里是输出:

1
2
myPk
<QueryDict: {}>

如何解决此问题?


您需要将payload作为序列化的json对象发送。

1
2
3
4
5
import json
import requests
payload = {"foo":"bar"}
headers = {'Content-type': 'application/json'}
r = requests.put("https://.../myPk/", data=json.dumps(payload), headers=headers)

否则,DRF实际上会抱怨:

1
*** ParseError: JSON parse error - No JSON object could be decoded

您可以通过调试视图(例如使用pdb或ipdb)或打印如下变量来查看该错误消息:

1
2
3
def update(self, request, pk = None):
    print pk
    print str(request.data)


在此处检查2个问题:-

  • Json格式是否正确。
  • 网址正确与否(由于遇到问题,我在网址中缺少尾部反斜杠)
  • 希望对您有所帮助


    假设您正在使用足够新版本的请求,请执行以下操作:

    1
    2
    3
    4
    import requests

    payload = {"foo":"bar"}
    r = requests.put("https://.../myPk", json=payload, headers=headers)

    然后它将为您正确格式化有效负载并提供适当的标头。否则,您将发送DRF无法正确解析的application/x-www-urlformencoded数据,因为您告诉它您正在发送JSON。