【问题标题】:Django, Requests, and Django REST frameworkDjango、请求和 Django REST 框架
【发布时间】:2014-08-14 03:35:08
【问题描述】:

我已经实现了一个 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)

当我通过浏览器更新用户信息时效果很好。 但是我很难使用 Requests (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,它似乎是空的。如果有人可以帮助找出我的代码有什么问题,或者如果我遗漏了一些额外的设置/参数来提出这个简单的请求,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    您缺少 django-rest 框架解析器装饰器,在您的情况下,您需要使用 @parser_classes((FormParser,)) 来填充 request.DATA 字典。 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)
    

    【讨论】:

    • 谢谢。试过FormParser和JSONParser,还是没有机会。为了澄清起见,我从另一个视图中调用了其余的 api。有什么区别吗?
    • 哦,我想是的,因为请求对象来自“视图”,而不是来自浏览器。你能粘贴你的完整代码吗?
    • 叹息。这是 Requests 包的问题。我重新安装了软件包,现在它可以工作了!谢谢。
    【解决方案2】:

    尝试使用 JSON 做所有事情。

    1. 添加 JSONParser,如 levi 解释
    2. 将自定义标头添加到您的请求中,例如 this example

    所以对你来说,也许是这样的:

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

    【讨论】:

      【解决方案3】:

      Requests 的包有问题。我重新安装了软件包,现在它可以工作了。 谢谢大家。

      【讨论】:

        猜你喜欢
        • 2017-05-22
        • 1970-01-01
        • 2013-11-07
        • 2015-06-18
        • 1970-01-01
        • 2019-07-14
        • 2023-03-21
        • 2016-04-07
        • 1970-01-01
        相关资源
        最近更新 更多