我已经实现了一个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
,似乎它是空的。我很感激,如果有人可以帮我找到我的代码有什么问题,或者我是否缺少一些额外的设置/参数来做出这个简单的请求。
答案 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完成所有操作。
所以对你来说,也许是这样的:
>>> payload = {'id':id, ...}
>>> headers = {'content-type': 'application/json'}
>>> r = requests.put(url, data=json.dumps(payload), headers=headers)
答案 2 :(得分:0)
Requests包中存在问题。我重新安装了包,现在它正在运行。 谢谢大家。