Как сделать Google Blob общедоступным в функции DRF to_internal_value?
У меня есть следующий код, который отображает общедоступный URL-адрес облачного хранилища 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
Проблема в том, что это удваивает время запроса. Другими словами, вместо того, чтобы публиковать большой двоичный объект только при первой его загрузке, код выполняет этот код каждый раз, когда объект сериализуется клиенту. Я пытался переместить make_public()
позвонить в to_internal_value
, но до сих пор не имели успеха, вероятно, потому что я не знаю точно, как получить value
,