сериализатор.is_valid() возвращает 500 внутренних ошибок сервера

#reactjs #django #django-rest-framework #axios #django-serializer

Вопрос:

Я новичок в Django, и у меня возникли проблемы с созданием API django-rest-framework для post, наследующего APIView. Я использую сериализатор, который наследует djangos ModelSerializer. Я вижу 500 внутренних ошибок сервера всякий раз, когда пытаюсь проверить сериализатор.

color.js публикует изображение с использованием фреймворка Django rest следующим образом.

 function PersonalColorScreen({navigation,route}) {
    const {image} = route.params;
    console.log('uri is', image.uri);
    const [userToken, setUserToken] = React.useState(route.params?.userToken);

    const requestHeaders = {
        headers: {
            "Content-Type": "multipart/form-data"
        }
    }
    // helper function: generate a new file from base64 String
    //convert base64 image data to file object to pass it onto imagefield of serializer.
    //otherwise, serializer outputs 500 Internal server error code

    const dataURLtoFile = (dataurl, filename) => {
    const arr = dataurl.split(',')
    const mime = arr[0].match(/:(.*?);/)[1]
    const bstr = atob(arr[1])
    let n = bstr.length
    const u8arr = new Uint8Array(n)
    while (n) {
      u8arr[n - 1] = bstr.charCodeAt(n - 1)
      n -= 1 // to make eslint happy
    }
    return new File([u8arr], filename, { type: mime })
  }
  //random number between 0-9
  function getRandomInt(max) {
    return Math.floor(Math.random() * max);
  }
  
  // generate file from base64 string
  const file = dataURLtoFile(image.uri, `${getRandomInt(10)}.png`)
  const formData= new FormData();
  formData.append('img',file,file.name);

  console.log(file.name);
    //axios post request to send data
    // axios.post('http://localhost:8000/accounts/personalcolor/',  formData,requestHeaders)
    //multipartparser
    axios.post('http://localhost:8000/accounts/personalcolor/', formData, requestHeaders)
    .then(res => {
        console.log(res);
        if (res.data === 'upload another image') {
            setimageError('upload another image');
        } else {
            // signUp(userToken);
            let color;
            switch (res.data){
                case ('spring'):
                    color = 'spring';
                    break;
                case ('summer'):
                    color = 'summer';
                    break;
                case ('fall'):
                    color = 'fall';
                    break;
                case ('winter'):
                    color = 'winter';
                    break;
            }
        }
        })
    .catch(err => {
        console.error(err.response.data)
    })
 

view.py обрабатывает опубликованное изображение. Я пытаюсь сохранить сериализатор, чтобы сохранить изображение в папке мультимедиа. Путь к изображению должен быть извлечен.

 @api_view(['POST'])
def personalcolor(request):

serializer = ColorSerializer(request.data)
# validation of input data
if serializer.is_valid():
    # serializer.save()
    return Response(serializer.data, status = status.HTTP_201_CREATED)
else:
    return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
 

model.py

 class Personalcolor(models.Model):
    objects = models.Manager()
    img = models.ImageField('personal_img',upload_to="personalcolor/", blank=True)
 

serializer.py

 class ColorSerializer(serializers.ModelSerializer):
   class Meta:
      model = Personalcolor
      fields = ('img',)
 

Выполнение кода возвращает «Не удалось загрузить ресурс: сервер ответил со статусом 500 (Внутренняя ошибка сервера)». Я думаю, что с сериализатором что-то не так, но не смог понять этого даже после поиска в Интернете.
Любая помощь была бы очень признательна.

Комментарии:

1. Вы должны использовать data для request.data , так что ColorSerializer(daata=request.data)

2. Спасибо. serializer.is_valid() больше не возвращает ошибки, но serializer.save() возвращает 500 внутренних ошибок сервера, даже если он сохраняет изображение в папке мультимедиа.

Ответ №1:

Убедитесь, что формат JSON, который вы отправляете, правильный. Ключ json должен совпадать с именем поля модели… Это должно быть в точности так, как структурировано имя поля модели.

И в тебе Сериализатор, изменяйся;

fields = ('img')

Для

fields = ['img']

Если вы хотите вернуть все экземпляры модели, используйте;

fields = '__all__'

Комментарии:

1.Спасибо. serializer.is_valid() больше не возвращает ошибки, но serializer.save() возвращает 500 внутренних ошибок сервера, даже если он сохраняет изображение в папке мультимедиа.