Django,Requests和Django REST框架

时间:2014-08-14 03:35:09

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

我已经实现了一个REST Api(http://www.django-rest-framework.org/),如下所示:

@csrf_exempt
@api_view(['PUT'])
def updateinfo(request, id, format=None):
    try:
        user = User.objects.get(id=id)
    except User.DoesNotExist:
        return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'PUT':
        serializer = UserSerializer(user, data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

通过浏览器更新用户信息时工作正常。 但是我在使用请求(http://docs.python-requests.org/en/latest/)调用此Api时遇到了困难。

这是我的代码,我在调用上面的api:

payload = {'id':id, ...}          
resp = requests.put(updateuserinfo_url, data=payload)

这是我收到的回复:

resp.text 
   {"id": ["This field is required."], ...}

我检查了request.DATA,似乎它是空的。我很感激,如果有人可以帮我找到我的代码有什么问题,或者我是否缺少一些额外的设置/参数来做出这个简单的请求。

3 个答案:

答案 0 :(得分:1)

您缺少django-rest框架解析器装饰器,在您的情况下,您需要使用@parser_classes((FormParser,))来填充request.DATA dict。 Read more here

尝试:

from rest_framework.parsers import FormParser


@parser_classes((FormParser,))
@csrf_exempt
@api_view(['PUT'])
def updateinfo(request, id, format=None):
    try:
        user = User.objects.get(id=id)
    except User.DoesNotExist:
        return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'PUT':
        serializer = UserSerializer(user, data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

答案 1 :(得分:0)

尝试使用JSON完成所有操作。

  1. 添加JSONParser,如levi解释
  2. 在您的请求中添加自定义标头,例如this example
  3. 所以对你来说,也许是这样的:

    >>> payload = {'id':id, ...}        
    >>> headers = {'content-type': 'application/json'}
    
    >>> r = requests.put(url, data=json.dumps(payload), headers=headers)
    

答案 2 :(得分:0)

Requests包中存在问题。我重新安装了包,现在它正在运行。 谢谢大家。