如何在DRF to_internal_value函数中使google blob公开?

时间:2018-01-16 01:43:54

标签: django-rest-framework google-cloud-storage gcloud-python

我有以下代码,用于为我上传的图片提供公共Google云端存储网址:

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

问题是这会使请求的时间加倍。换句话说,不是在第一次上传时使blob公开,而是每次将对象序列化到客户端时代码都会执行此代码。我已尝试将make_public()调用移至to_internal_value,但到目前为止尚未成功,可能是因为我不确切知道如何获取value

0 个答案:

没有答案