为什么我会收到 400 错误请求错误?使用 Django Rest 框架作为后端并使用 React 作为我的 Web 应用程序的前端

Why am I getting a 400 bad request error? Using the Django Rest framework as a backend and React as a frontend for my web application

我正在开发一个使用 openweathermap api 的简单 Web 应用程序。有一个 api 调用 returns api 数据的视图,并显示用户输入的特定城市天气的温度和描述。

下面的 api 调用是对一项新功能的另一个调用,该功能允许用户保存他们选择的特定天气数据。它从状态中获取 temp 和 desc,并将其发送到后端视图。然后视图将该数据保存到数据库中,然后 returns 一个响应,我将使用它在同一个 api 调用中显示数据。它给我一个 400 错误。我在控制台记录了 temp 和 desc,它们都正确打印出来,所以我没有向后端发送未定义的数据。难道是我序列化数据的方式?

前端api调用

const saveWeather = (temperature, description) => {
     const requestOptions = {
          method: "POST",
          headers: { "Content-Type": "application/json"},
          body: JSON.stringify({
            temperature: temperature,
            description: description
          })
        };
    
    fetch("/api/savedweather", requestOptions)
      .then((response) => {
        if (response.ok) {
          console.log("OK");
        }
      })
      .catch((error) => {
        console.log(error);
      });
  }

查看

class SaveWeather(APIView):
serializer_class = WeatherSerializer

def post(self, request, format=None):
    serializer = self.serializer_class(data=request.data)

    if serializer.is_valid():
        temperature = serializer.data.get('temperature')
        description = serializer.data.get('description')
        weather = Weather(temperature=temperature, description=description)
        weather.save()
        return Response(WeatherSerializer(weather).data, status=status.HTTP_201_CREATED)
    
    return Response({'Bad Request': "Invalid Data..."}, status=status.HTTP_400_BAD_REQUEST)

型号

from django.db import models

class Weather(models.Model):
    temperature = models.IntegerField(null=False, default=1)
    description = models.CharField(max_length=50)

序列化器Class

from .models import Weather
from rest_framework import serializers 

class WeatherSerializer(serializers.ModelSerializer):
    class Meta: 
        model = Weather
        fields = ('temperature', 'description')

不知道模型和序列化器定义就很难分辨。

但由于它显然似乎是序列化器验证错误,您可以使用 serializer.errors 字段检查序列化器抛出的错误。

if serializer.is_valid():
    ...
    return Response(WeatherSerializer(weather).data, status=status.HTTP_201_CREATED)

print(serializer.errors)