Django: Использование makedirs в AWS S3
У меня есть код, который автоматизирует CSV и создает каталог с помощью makedirs с uuid dirname. Код работает на моей локальной машине, но не в S3.
Я использую href для загрузки файла csv, передавая file_path в контексте.
views.py
def makedirs(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
return path
def ..
tmp_name = str(uuid.uuid4())
file_path = 'static/tmp/'+tmp_name+'/'
file_path = makedirs(file_path)
reviews_df.to_csv(file_path+'file_processed.csv', index=False)
Большое спасибо!
Для python и s3 вам необходимо иметь права на запись в ведро и знать имя ведра. Здесь я буду считать, что у вас есть и то, и другое.
В AWS python SDK boto3 у вас есть либо клиент, либо ресурс - хотя не все сервисы будут иметь оба, наиболее часто используемые сервисы обычно имеют их
# s3 client
import boto3
s3_client = boto3.client('s3')
s3_client.upload_file(local_file_name, bucket_name, key_in_s3)
Клиент обычно является аспектом более низкого уровня службы AWS и обычно более полезен, если вы сами пишете некоторый код инфраструктуры. Ресурс - обычно - это более высокий уровень абстракции.
# s3 resource
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket(bucket_name)
bucket.upload_file(local_file_name, key_in_s3)
Также выбор использования ресурса не исключает возможности использования клиента для той же службы AWS. Вы можете сделать это, используя атрибут meta на ресурсе. Например, чтобы использовать клиентскую загрузку, как описано выше, но используя ресурс s3, а не клиент, вы должны сделать:
# client from resource
s3_resource.meta.client.upload_file(local_file_name, bucket_name, key_in_s3)
но обычно вы не будете этого делать, потому что ведро под ресурсом уже имеет эту опцию для вас.
Несмотря на то, что key_in_s3 не обязательно должно совпадать с тем, что у вас есть в локальной файловой системе, вероятно, будет хорошей идеей (для вашего здравомыслия) использовать то же значение, если у вас нет других требований.
Похоже, что ваше требование заключается в том, чтобы ключ s3 был uuid. Если вы планируете загрузить файлы в будущем и хотите избежать хлопот с выбором приложения, вы можете включить расширение .csv после uuid при загрузке на s3. Однако это не является требованием со стороны s3.
Q: Как сделать каталог?
A: Ведро - это действительно каталог. Внутри ведра в S3 нет понятия каталога. Символы / используются для разграничения списков объектов в консоли AWS и в AWS CLI, но это скорее удобство. Если вы хотите иметь такую возможность, вы можете создать ее в коде, где вы пишете ключ s3. Другими словами, путь к файлу и имя файла в одной строке должны работать нормально.