Сохранение HTML в памяти для S3 AWS Python Boto3 - PullRequest
0 голосов
/ 30 августа 2018
import boto3
from io import StringIO
s3 = boto3.client('s3')

display = # Altair Charting

buff = StringIO(display.save(str_obj, 'html'))

s3.upload_fileobj(buff.read(), BUCKET, 'index.html')

Я думаю, что полный пример усложнит проблему, поэтому я оставил комментарии Альтаира закомментированными.

Во всяком случае, я пытался реализовать огромное количество предложений по сохранению объектов и файлов в корзины AWS S3, но я не понимаю.

Сохранение на диск так же просто, как:

display.save('index.html')

Получение этого на S3 кажется чрезвычайно трудным сравнением. Я не уверен, что мне здесь не хватает. Возможно, upload_fileobj - это не правильный метод, но я пытался заставить эту работу работать вокруг себя.

Специфическая ошибка этого метода: ValueError: Fileobj must implement read

UPDATE:

buff = StringIO(display.save('str.html'))

s3.put_object(
   Bucket=BUCKET, 
   Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
   Body=buff.read()
   )

Результаты в 0-байтовом файле index.html в моем Bucket

ОБНОВЛЕНИЕ 2:

str_obj = StringIO()
display.save(str_obj, 'html')
buff = str_obj.read()

s3.put_object(
    Bucket=BUCKET, 
    Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
    Body=buff
    )

Это тоже не работает. Я просто не могу поверить, что сохранение файла на S3 это сложно. Оглядываясь назад: у меня не было метода getvalue(), необходимого для buff

РЕШЕНИЕ: Это не первый раз, когда я боролся с файлами S3, поэтому я, вероятно, оставляю это для моего собственного будущего использования. Тем не менее, мне до сих пор не ясно, почему я не смог сохранить файл .html в виде строки.

import boto3
from io import StringIO
s3 = boto3.client('s3')

display = # Altair Charting

str_obj = StringIO() # instantiate in-memory string object
display.save(str_obj, 'html') # saving to memory string object
buf = str_obj.getvalue().encode() # convert in-memory string to bytes

# Upload as bytes
s3.put_object(
    Bucket=BUCKET, 
    Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html', 
    Body=buf
    )

1 Ответ

0 голосов
/ 30 августа 2018

Из boto3 документов: put_object

Body = b'bytes' | файл,

Что означает, что Body должно быть дескриптором файла или байтовой строкой. Таким образом, есть (как минимум) 2 возможных способа загрузки:

Передавая дескриптор файла в Body:

with open('index.hml', 'rb') as f:
    s3.put_object(Bucket=BUCKET, Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html', Body=f)

Передав строку body в Body (предположим, возвращаемая строка display.save ()):

buf = display.save('str.html').encode() # converting str to bytes
s3.put_object(Bucket=BUCKET, Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html', Body=buf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...