How to make google blob public in DRF to_internal_value function?

207 Views Asked by At

I have the following code which serves up a public google cloud storage url for images I am uploading:

def to_internal_value(self, data):
    file_name = str(uuid.uuid4())
    # Get the file name extension:
    file_extension = self.get_file_extension(file_name, data)

    complete_file_name = "{}.{}".format(file_name, file_extension)
    uploaded = data.read()
    img = Image.open(io.BytesIO(uploaded))
    new_image_io = io.BytesIO()
    megapixels = img.width * img.height

    # reduce size if image is bigger than MEGAPIXEL_LIMIT
    if megapixels > self.MEGAPIXEL_LIMIT:
        resize_factor = math.sqrt(megapixels/self.MEGAPIXEL_LIMIT)
        resized = resizeimage.resize_thumbnail(img, [img.width/resize_factor,
                                                     img.height/resize_factor])
        resized.save(new_image_io, format=file_extension.upper())
    else:
        img.save(new_image_io, format=file_extension.upper())
    content = ContentFile(new_image_io.getvalue(), name=complete_file_name)
    return super(Base64ImageField, self).to_internal_value(content)

def to_representation(self, value):
    try:
        blob = Blob(name=value.name, bucket=bucket)
        blob.make_public()
        return blob.public_url
    except ValueError as e:
        return value

The problem is that this is doubling the time for the request. In other words, instead of making the blob public just the first time it is uploaded, the code is executing this code each time the object is serialized to the client. I have tried moving the make_public() call into to_internal_value, but so far haven't had success, probably because I don't know exactly how to get value.

0

There are 0 best solutions below