简体   繁体   English

(django) 'utf-8' 编解码器无法解码位置 0 的字节 0x89:无效的起始字节

[英](django) 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte

I am now trying to assign two foreignkey onto the same custom user model, the username & profile image field.我现在正在尝试将两个foreignkey键分配给同一个自定义用户模型,即用户名和个人资料图像字段。 Custom User model:自定义用户模型:

class Account(AbstractBaseUser, PermissionsMixin):
    
    class Meta:
        verbose_name_plural = "Account List"

    email = models.EmailField(max_length=255, unique=True)
    username = models.CharField(max_length=255, unique=True)
    name = models.CharField(max_length=255, default="")
    profile_image = models.ImageField(max_length=255, upload_to=profile_image_path, blank=True, unique=True)
    about = models.TextField(max_length=255, default='Write something about yourself...', blank=True)
    start_date = models.DateTimeField(default=timezone.now)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["username", "name"]

    def __str__(self):
        return self.username

Thread model:螺纹型号:

class Thread(models.Model):

    options = (('active', 'Active'), ('deactivated', 'Deactivated'))

    username = models.ForeignKey(Account, on_delete=models.CASCADE, to_field='username', related_name='user')
    profile_image = models.ForeignKey(Account, on_delete=models.CASCADE, to_field='profile_image', related_name='profile')
    alt = models.TextField(max_length=255, blank=True)
    image = models.ImageField(max_length=255, upload_to=thread_image_path, default='images/family.png')
    content = models.TextField(blank=True)
    created = models.DateTimeField(default=timezone.now)
    status = models.CharField(max_length=11, choices=options, default='active')

However, whenever I try to create a Thread, I always encounter the error:但是,每当我尝试创建线程时,总是会遇到错误:

UnicodeDecodeError at /api/public/thread/
'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
Request Method: GET
Request URL:    http://127.0.0.1:8000/api/public/thread/
Django Version: 4.0.4
Exception Type: UnicodeDecodeError
Exception Value:    
'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
Exception Location: c:\Users\85291\Desktop\vscode\my-app\web\env\lib\site-packages\rest_framework\utils\encoders.py, line 50, in default

This error occurred right after I assign the foreignkey to the profile image, the serializer is unable to serialize the image to the API endpoint.在我将外键分配给配置文件图像后立即发生此错误,序列化程序无法将图像序列化到 API 端点。 I have tried going to encoders.py and change the encoder to utf16, but the problem remained.我已经尝试去encoders.py并将编码器更改为utf16,但问题仍然存在。

Anyone has an idea what's wrong with my code?有人知道我的代码有什么问题吗?

Edit:编辑:

Custom User serializer.py:自定义用户 serializer.py:

class UserSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Account
        fields = (
            'id',
            'email',
            'username',
            'name',
            'profile_image',
            'about',
            'start_date',
            'is_active',
            'last_login'
        )
        read_only_field = ('start_date',)

class RegisterSerializer(UserSerializer):
    
    password = serializers.CharField(max_length=128, min_length=8, required=True, write_only=True)
    email = serializers.EmailField(max_length=128, required=True, write_only=True)
    username = serializers.CharField(max_length=128, required=True)
    name = serializers.CharField(max_length=128, required=True)

    class Meta:
        model = Account
        fields = [
            'email',
            'username',
            'password',
            'name',
        ]
        extra_kwargs = {'password': {'wirte_only': True}}
        
    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)
        
        if password is not None:
            instance.set_password(password)
            
        instance.save()
        
        return instance

class LoginSerialier(TokenObtainPairSerializer):
    
    def validate(self, attrs):
        
        data = super().validate(attrs)
        refresh = self.get_token(self.user)
        data['user'] = UserSerializer(self.user).data
        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)

        if api_settings.UPDATE_LAST_LOGIN:
            update_last_login(None, self.user)

        return data

Custom User serializer.py:自定义用户 serializer.py:

class RegisterViewSet(viewsets.ModelViewSet):
    permission_classes = (AllowAny,)
    
    def create(self, request, format='json'):
        serializer = RegisterSerializer(data=request.data)
        
        if serializer.is_valid():
            user = serializer.save()
            
            if user:
                json = serializer.data
                
                return Response(json, status=status.HTTP_201_CREATED)
        
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        
class LoginViewSet(viewsets.ModelViewSet, TokenObtainPairView):
    serializer_class = LoginSerialier
    permission_classes = (AllowAny,)
    
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        
        try:
            serializer.is_valid(raise_exception=True)
            
        except TokenError as e:
            raise InvalidToken(e.args[0])
        
        return Response(serializer.validated_data, status=status.HTTP_200_OK)
    
class RefreshViewSet(viewsets.ViewSet, TokenRefreshView):
    permission_classes = (AllowAny,)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        try:
            serializer.is_valid(raise_exception=True)
            
        except TokenError as e:
            raise InvalidToken(e.args[0])

        return Response(serializer.validated_data, status=status.HTTP_200_OK)        

class UserViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.none()
    serializer_class = UserSerializer 
    permission_classes = (IsAuthenticated,)
    
    def get_queryset(self): 
        return Account.objects.filter(id=self.request.user.id)
    
class BlacklistTokenView(viewsets.ModelViewSet):
    permission_classes = (AllowAny,)

    def post(self, request):
        try:
            refresh_token = request.data["refresh_token"]
            token = RefreshToken(refresh_token)
            token.blacklist()
            
            return Response(status=status.HTTP_205_RESET_CONTENT)
        
        except Exception as e:
            
            return Response(status=status.HTTP_400_BAD_REQUEST)

Thread serializer.py:线程序列化器.py:

class ThreadSerializer(serializers.ModelSerializer):

    created = serializers.DateTimeField(format="%d %B, %Y %H:%M:%S")

    class Meta:
        model = Thread
        fields = (
                  'id',
                  'username', 
                  'profile_image',
                  'alt', 
                  'image', 
                  'content', 
                  'created', 
                  'status')

Thread view.py线程视图.py

class ThreadView(generics.ListAPIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = ThreadSerializer
    
    def get_queryset(self):
        username = self.request.user.username
        return Thread.objects.filter(username=username)
    
class ThreadViewSets(viewsets.ModelViewSet):
    permission_classes = (AllowAny,)
    serializer_class = ThreadSerializer
    queryset = Thread.objects.all()

I think you can deal with the uploaded image.我认为您可以处理上传的图像。

class ThreadSerializer(serializers.ModelSerializer):
    created = serializers.DateTimeField(format="%d %B, %Y %H:%M:%S")
    uploaded_image = serializers.FileField(
        max_length = 1000000,
        allow_empty_file = False,
        write_only = True
    )
    profile_image = UserSerializer(read_only = True)

    class Meta:
        model = Thread
        fields = (
            ...,
            'uploaded_image',
        )
        extra_kwargs = {
            'image': { 'read_only': True }
        }

    
    def create(self, validated_data):
        image_data = validated_data.pop('uploaded_image')
        thread_obj = Thread(**validated_data)
        thread_obj.image = image_data
        thread_obj.save()
        return thread_obj

In frontend, you need to upload the image with the key uploaded_image .在前端,您需要使用密钥uploaded_image图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 “utf-8”编解码器无法解码位置 0 中的字节 0x89:起始字节无效 - 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte 在 Django 中上传图像:“utf-8”编解码器无法解码位置 246 中的字节 0x89:起始字节无效 - Uploading Image in Django: 'utf-8' codec can't decode byte 0x89 in position 246: invalid start byte UnicodeDecodeError:“utf-8”编解码器无法解码 position 中的字节 0x89 0:起始字节无效。 如何修复 - UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte. How to fix it “utf-8”编解码器无法解码字节 0x89 - 'utf-8' codec can't decode byte 0x89 “utf-8”编解码器无法解码 position 中的字节 0x8b 0:无效的起始字节 django - 'utf-8' codec can't decode byte 0x8b in position 0: invalid start byte django UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 3131 中的字节 0x80:起始字节无效 - UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 3131: invalid start byte “utf-8”编解码器无法解码位置 11 中的字节 0x92:起始字节无效 - 'utf-8' codec can't decode byte 0x92 in position 11: invalid start byte Python UnicodeDecodeError:“ utf-8”编解码器无法解码位置2的字节0x8c:无效的起始字节 - Python UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8c in position 2: invalid start byte UnicodeDecodeError:'utf-8'编解码器无法解码位置3的字节0x97:无效的起始字节 - UnicodeDecodeError: 'utf-8' codec can't decode byte 0x97 in position 3: invalid start byte “utf-8”编解码器无法解码 position 18 中的字节 0x92:无效的起始字节 - 'utf-8' codec can't decode byte 0x92 in position 18: invalid start byte
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM