Почему я получаю ошибку 400 неверных запросов? Использование фреймворка Django Rest в качестве бэкэнда и React в качестве внешнего интерфейса для моего веб-приложения

Я разрабатываю простое веб-приложение, использующее openweathermap API. Существует вызов 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.info("OK");
        }
      })
      .catch((error) => {
        console.info(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')
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
4
0
11 977
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно сказать, не зная определений модели и сериализатора.

но поскольку это явно ошибка проверки сериализатора, вы можете проверить ошибки, выдаваемые сериализаторами, с помощью поля serializer.errors.

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

print(serializer.errors)

Спасибо за ответ. Я только что добавил свой класс модели и сериализатора выше. Я также использовал ошибки сериализатора, и это дало мне это {'temperature': [ErrorDetail(string='A valid integer is required.', code='invalid')]}

MPagan 23.12.2020 06:21

Как говорится, температура не является целым числом, проверьте request.data, если temperature целое число.

Adithya 23.12.2020 06:30

Это сработало! Спасибо за отзыв, я только что изменил температуру на DecimalField.

MPagan 23.12.2020 06:50

Другие вопросы по теме