【问题标题】:Rest Framework Image ValidationRest 框架图像验证
【发布时间】:2020-01-30 07:00:41
【问题描述】:

我有一个通过 Django Rest Framework 发送图像的表单。序列化器如图:

class AvatarSerializer(serializers.ModelSerializer):
    avatar = Base64ImageField(validators=[image_validation])

    class Meta:
        model = Profile
        fields = ('avatar',)

我还进行了图像验证,检查图像的大小,使其不超过 12MB:

def image_validation(image):
    # 12MB
    MAX_FILE_SIZE = 12000000
    print(image.name)
    if image.size > MAX_FILE_SIZE:
        print(image.size)
        raise ValidationError("File size too big!")

当我尝试上传大于 12mb 的图像时,图像大小会被打印出来,但是,我在 Chrome 的网络选项卡中得到了这个响应:Failed to load response data 我读到这可能是因为图像的大小(我试图上传一张 30mb 的图片)。 ValidationError 未显示,用户收到 500 服务器错误。我该如何解决这个问题?

【问题讨论】:

  • 每个请求都有服务器超时。如果请求花费太多时间,它将在进入序列化程序之前终止并返回 500 内部错误。
  • @user2896120 你在用django-extra-fields 代替Base64ImageField吗?
  • @Mirza715 我该如何做才能在花费太多时间时返回有效错误?
  • @funnydman 我正在使用Base64ImageField
  • @user2896120 看到这个stackoverflow.com/questions/42155616/…。在旁注中,在将文件上传到服务器之前尝试压缩文件

标签: django django-rest-framework


【解决方案1】:

序列化程序具有 field-level-validation 功能,可在返回之前验证属性。

https://www.django-rest-framework.org/api-guide/serializers/#field-level-validation

class AvatarSerializer(serializers.ModelSerializer):
    avatar = Base64ImageField()

    def validate_avatar(self, image):
        # 12MB
        MAX_FILE_SIZE = 12000000
        print(image.name)
        if image.size > MAX_FILE_SIZE:
            print(image.size)
            raise ValidationError("File size too big!")


    class Meta:
        model = Profile
        fields = ('avatar',)

【讨论】:

  • 我能知道,在使用这个之后,你得到了什么错误。
  • 您需要在 validate_avatar 函数中返回图像,除非您要为头像字段获取空值,
  • 看来validate_avatar应该加一个return image
猜你喜欢
  • 2013-06-29
  • 2017-09-26
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 2019-02-09
  • 2020-08-29
相关资源
最近更新 更多