首页 > 解决方案 > 为什么我收到 400 bad request 错误?使用 Django Rest 框架作为后端并使用 React 作为我的 Web 应用程序的前端

问题描述

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

下面的 api 调用是对新功能的另一个调用,该功能允许用户保存他们选择的特定天气数据。它从状态中获取 temp 和 desc,并将其发送到后端视图。然后视图将该数据保存到数据库中,并返回一个响应,然后我将使用该响应在同一个 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)

序列化器类

from .models import Weather
from rest_framework import serializers 

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

标签: reactjsdjangodjango-rest-frameworkfetchbad-request

解决方案


如果不知道模型和序列化程序定义,就很难分辨。

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

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

print(serializer.errors)

推荐阅读