[英]Can't send a post request using Postman with Django
我正在使用 Postman + Django rest 框架在本地創建 Post 請求,但我不斷收到 ParseError。 我的獲取請求工作正常,但發布請求未按預期工作。
JSON 解析錯誤 - 需要 ',' 分隔符:第 3 行第 2 列(字符 37)
我什至沒有收到代碼中定義的 400 錯誤,郵遞員返回 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)
您的請求一經調用就會被解析,而 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)
由於您使用的是基於函數的視圖,您可能想嘗試從 DRF 導入 api_view 裝飾器並使用它來修改 photo_list。 這是為了確保視圖接收到請求的實例並允許它返回響應。 請參閱此處的基於 DRF 函數的視圖部分。
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)
錯誤正在引發,因為您不接受從 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)
像這樣編輯您的視圖,
elif request.method == 'POST':
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.