为什么提高serializers.ValidationError()会导致UnicodeDecodeError?

问题描述 投票:0回答:1

我正在创建一个 Django Rest API(带有 ImageField)并且它工作正常。但我想向一些 CharFields 字段添加一些验证。我在添加验证器或只是引发验证错误时注意到一些 unicodeDecoderError 。花了很多时间试图解决它。任何帮助将不胜感激。

这是我的serializers.py 文件

from rest_framework import serializers
from .models import *

def validate_phone(phone_number: str):
  print(phone_number)
  if not (phone_number.startswith(("6", "7", "8", "9"))):
    raise serializers.ValidationError(
        {"phone": "phone number must startwith digits from 6-9 !!!"})

  if not phone_number.isnumeric():
    raise serializers.ValidationError(
         {"phone": "phone number should contain digits only !!!"})

  if len(phone_number) != 10:
     raise serializers.ValidationError(
         {"phone": "phone number must contain only 10 digits !!!"})


class StudentSerializer(serializers.ModelSerializer):
  start_date = serializers.DateField(format='%d %B %Y')
  phone = serializers.CharField(max_length=10, validators=[validate_phone])
  class Meta:
    model = Student
    fields = '__all__'

引发验证错误会导致 UnicodeDecoderError。否则工作正常。

这是我的 models.py 文件

from django.db import models

class Student(models.Model):
    ...
    phone = models.CharField(max_length=10)
    ...
    start_date = models.DateField()
    profile_picture = models.ImageField(upload_to='profile/', blank=True)
    ...

views.py

class CreateStudent(APIView):
    def get(self, request):
        students = Student.objects.all()
        serializer =  StudentSerializer(students, many=True)
        return Response({"data": serializer.data}, status=status.HTTP_200_OK)

    def post(self, request):
        data = request.data
        print(data)
        serializer = StudentSerializer(data = data)

        if serializer.is_valid():
            print("\nThis record is valid.")
            new_student = serializer.save()
            print(new_student.id)
            return Response({"message": "Data saved Successfully.", "data": serializer.data, "errors": serializer.errors})
        return Response({"message": "Invalid Data", "data": serializer.data, "errors": serializer.errors})

我使用 javascript fetch API 和 FormData() 发送数据,它处理文件格式和编码。

这是 javascript 文件:

const form = document.querySelector("form");
form.addEventListener("submit", (e) => {
  e.preventDefault();

  const formdata = new FormData(form);
  const json_data = Object.fromEntries(formdata);
  console.log(json_data);

  const requestOptions = {
    method: 'POST',
    body: formdata,
  };

  fetch("http://127.0.0.1:8000/api/join/", requestOptions)
    .then((response) => response.json())
    .then((result) => console.log(result))
    .catch((error) => console.error(error))

感到无助。在不引发 ValidationError 的情况下,它工作正常,我只想添加一些没有任何 UnicodeDecodeError 的验证。我尝试用邮递员测试,结果是一样的。我不知道如何继续。

我哪里失踪了

这是完整的回溯:

[05/Jul/2024 08:31:03] "POST /api/join/ HTTP/1.1" 200 316
Internal Server Error: /api/join/
Traceback (most recent call last):
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
    response = response.render()
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\django\template\response.py", line 114, in render
    self.content = self.rendered_content
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\rest_framework\response.py", line 74, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\rest_framework\renderers.py", line 100, in render
    ret = json.dumps(
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\rest_framework\utils\json.py", line 25, in dumps
    return json.dumps(*args, **kwargs)
  File "C:\Users\lokes\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\lokes\AppData\Local\Programs\Python\Python310\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\lokes\AppData\Local\Programs\Python\Python310\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\lokes\Desktop\Dambaruu\Tasks\Week-7\.api\lib\site-packages\rest_framework\utils\encoders.py", line 52, in default
    return obj.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
python django django-rest-framework
1个回答
0
投票

我认为你的问题出在“profile_picture”,它是一个 ImageField,请在 StudentSerializer 中尝试此操作,返回 profile_picture.url 而不是 profile_picture,因为 profile_picture.url 返回一个字符串而不是 ImageField 实例

© www.soinside.com 2019 - 2024. All rights reserved.