我正在使用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)
答案 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':