簡體   English   中英

無法使用 Postman 和 Django 發送發布請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM