在 django 中验证通过 post 请求传递的图像文件的问题
Issues in validating Image file passed through post request in django
我想在我的 Django 项目中验证两件事:
传递的图像是否有效(具有适当的扩展名、非空等)
我有一个函数 isCovering70p
,它 returns bool,取决于图像中的对象是否覆盖了 70% 的区域。
现在我必须在将数据保存到数据库之前也检查一下。如果用户发布的图像未通过这 2 个中的任何一个,则应发送 400
响应代码。
这是我的 models.py:
def user_image_dir_path(instance, filename):
return f"uploads/users/{instance.email}/{filename}"
class UserDetail(models.Model):
email = models.EmailField(max_length=80)
registration_time = models.DateTimeField(auto_now_add=True)
image_path = models.ImageField(upload_to=user_image_dir_path)
image_meta = models.CharField(max_length=100)
@property
def filename(self):
return os.path.basename(self.file.name)
这是我的 serializers.py:
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetail
fields = ['full_name', 'email', 'org_id', 'image_path']
从 DRF docs,我知道我的 #1 验证条件将由 DRF/django 处理。
但是,我应该如何以及在何处处理 #2 情况?
此外,我想根据 isCovering70p
更新我的 image_meta
字段。我应该如何以及在哪里放置该更新的逻辑?
解决此问题的一种方法是使用序列化程序上的验证方法
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetail
fields = ['full_name', 'email', 'org_id', 'image_path']
def validate(self, data):
if not isCovering70p(data['image_path']):
raise serializers.ValidationError({'image_path': 'image is not covering 70% of area')
return data
您可以只向序列化程序添加一个验证函数,并在收到的数据无效时引发 ValidationError。
我想在我的 Django 项目中验证两件事:
传递的图像是否有效(具有适当的扩展名、非空等)
我有一个函数
isCovering70p
,它 returns bool,取决于图像中的对象是否覆盖了 70% 的区域。 现在我必须在将数据保存到数据库之前也检查一下。如果用户发布的图像未通过这 2 个中的任何一个,则应发送400
响应代码。
这是我的 models.py:
def user_image_dir_path(instance, filename):
return f"uploads/users/{instance.email}/{filename}"
class UserDetail(models.Model):
email = models.EmailField(max_length=80)
registration_time = models.DateTimeField(auto_now_add=True)
image_path = models.ImageField(upload_to=user_image_dir_path)
image_meta = models.CharField(max_length=100)
@property
def filename(self):
return os.path.basename(self.file.name)
这是我的 serializers.py:
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetail
fields = ['full_name', 'email', 'org_id', 'image_path']
从 DRF docs,我知道我的 #1 验证条件将由 DRF/django 处理。
但是,我应该如何以及在何处处理 #2 情况?
此外,我想根据 isCovering70p
更新我的 image_meta
字段。我应该如何以及在哪里放置该更新的逻辑?
解决此问题的一种方法是使用序列化程序上的验证方法
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetail
fields = ['full_name', 'email', 'org_id', 'image_path']
def validate(self, data):
if not isCovering70p(data['image_path']):
raise serializers.ValidationError({'image_path': 'image is not covering 70% of area')
return data
您可以只向序列化程序添加一个验证函数,并在收到的数据无效时引发 ValidationError。