Django Rest Framework:空的request.data

时间:2015-06-05 16:50:06

标签: python django django-rest-framework python-requests

我有以下代码来查看DRF:

    $('.filterOptions').change(function(){

    var theChosenLang = $('#langOption').find(':selected').attr('data-lang-option');

    var theChosenCat = $('#categoryOption').find(':selected').attr('data-category-option');


    $('.displayBox').css('display','none');
    var selector = '.displayBox';

    if(theChosenLang != "all"){
        selector += '[data-lang-option="'+ theChosenLang +'"]';
    } 
    if(theChosenCat != "all"){
        selector += '[data-category-option="'+ theChosenCat +'"]';
    }

    $(selector).fadeIn();

}); 

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

from rest_framework import viewsets

class MyViewSet(viewsets.ViewSet):

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

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

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

如何解决此问题?

3 个答案:

答案 0 :(得分:13)

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

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

否则会发生什么事情,DRF实际上会抱怨:

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

您会通过调试视图(例如使用pdbipdb)或打印变量来看到错误消息:

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

答案 1 :(得分:3)

在这里检查2个问题: -

  1. Json格式是否合适。
  2. 网址是否正确(我的网址中缺少尾随反斜杠,因为我正面临这个问题)
  3. 希望有所帮助

答案 2 :(得分:1)

假设您需要执行足够新的请求,请执行以下操作:

import requests

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

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