无法使用Postman与Django发送帖子请求

时间:2017-05-25 15:57:46

标签: python django post django-rest-framework postman

我正在使用Postman + Django休息框架在本地创建Post请求,但我不断收到ParseError。我的Get请求工作正常但是帖子请求没有按预期工作。

  

JSON解析错误 - 期待','分隔符:第3行第2列(char 37)

我甚至没有在代码中定义400错误,Postman返回500内部服务器错误消息。

这是我的photo_list views.py:

from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from .models import Photo
from .serializers import PhotoSerializer

@csrf_exempt
def photo_list(request, pk=0):
"""
List all photos, or create a new one.
"""
if request.method == 'GET':
    if int(pk) > 0: # convert pk to an int then check if it is greater than zero
        photo = Photo.objects.get(pk=pk)
        serializer = PhotoSerializer(photo, many=False)
        return JsonResponse(serializer.data, safe=False)

    photos = Photo.objects.all()
    serializer = PhotoSerializer(photos, many=True)
    return JsonResponse(serializer.data, safe=False)

elif request.method == 'POST':
    data = JSONParser().parse(request)
    serializer = PhotoSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

4 个答案:

答案 0 :(得分:1)

您的请求在调用后立即被解析,而request.DATA实际上正在返回您希望解析的字典。

json = request.DATA

请更新您的代码,如下所示

from rest_framework.decorators import api_view

@csrf_exempt
@api_view(['GET', 'POST'])
def photo_list(request, pk=0):
"""
List all photos, or create a new one.
"""
if request.method == 'GET':
    # your existing code

elif request.method == 'POST':
    serializer = PhotoSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

答案 1 :(得分:1)

由于您正在使用基于函数的视图,因此您可能希望尝试从DRF导入api_view装饰器并使用它来修改photo_list。这是为了确保视图接收Request的实例并允许它返回Response。请参阅基于DRF功能的视图部分here

from rest_framework.decorators import api_view
...
...
@api_view(['GET', 'POST'])
def photo_list(request)
...


elif request.method == 'POST':
    d = request.data
    serializer = PhotoSerializer(data=d)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

答案 2 :(得分:0)

错误正在引发,因为您不接受request.POST到序列化程序中的数据。

像这样编辑您的视图,

elif request.method == 'POST':
    serializer = PhotoSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

答案 3 :(得分:-1)

像这样编辑您的视图,

elif request.method == 'POST':