Безопасный способ проверки расширения файла в сериализаторе Django

Я создал приложение, в котором я могу хранить изображения продуктов. В базе данных я храню только направления на изображения, которые хранятся в указанной папке. В моем сериализаторе мне нужно проверить имена файлов и проверить, являются ли эти расширения расширениями фотографий. Я написал что-то вроде этого ниже, является ли это лучшим способом проверки? Может быть, есть более безопасный метод?

ALLOWED_IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "bmp", "gif"]


class ProductImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductImage
        fields = [...]


class ProductSerializer(serializers.ModelSerializer):
    images = ProductImageSerializer(many=True, read_only=True)

    class Meta:
        model = Product
        fields = [..., 'images']

    def create(self, validated_data):
        ...

        for file in self.context['request'].FILES.getlist('images'):
            validate_extension(file.name)
            ...

        return item


def validate_extension(filename):
    extension = os.path.splitext(filename)[1].replace(".", "")
    if extension.lower() not in ALLOWED_IMAGE_EXTENSIONS:
        raise serializers.ValidationError(
            (f'Invalid uploaded file type: {filename}'),
            code='invalid',
        )

Можно добавить еще две проверки. Во-первых, вы можете проверить тип mime файла, например, используя пакет python-magic в linux (python-magic-bin для windows). Также вы можете сравнить размер файла с желаемым максимальным размером файла в вашем проекте.

Вернуться на верх