Как загрузить CSV-файл, созданный в Django, на AWS S3?
У меня есть модель Django, которая имеет поле FileField, файл должен быть сохранен в AWS S3.
models.py:
class Search(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='searches')
type = models.CharField(max_length=150)
keyword = models.CharField(max_length=150)
amount = models.IntegerField()
date = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=50)
results = models.FileField(blank=True, storage=PrivateMediaStorage())
Выгрузка на AWS S3 работает, когда я создаю новый объект в области администратора и загружаю туда файл. Однако я хочу создать CSV файл в бэкенде и загрузить его в S3 оттуда, не используя никакой формы.
Внутри функции бэкенда:
with open(f'results{search_id}.csv', 'w', newline='') as f:
writer = csv.writer(f)
header = ['name', 'email', 'follower_count', 'play count', 'share count', 'comment count', 'has email']
writer.writerow(header)
for result in results:
data = [result['author_name'], result['author_email'], result['follower_count'], result['play_count'], result['share_count'], result['comment_count'], result['has_email']]
writer.writerow(data)
# Updating database data
search = Search.objects.get(id=search_id)
search.status = 'Finished'
search.results = ContentFile(f)
search.save()
Однако сейчас это просто создает файл results.csv в моем каталоге Django и не загружает никакой файл на S3. Как я могу это исправить?
При вашем нынешнем подходе, я думаю, вам нужно сделать что-то подобное тому, что предлагается в этом посте.
Можно попробовать что-то вроде этого?
# replace this line
# search.results = ContentFile(f)
search.results.save(new_name, ContentFile(f.read()))
search.save()
Если вы хотите загрузить файл на s3 непосредственно из скрипта, вам нужно использовать boto3:
- Запустите сессию boto3
- Создайте объект для объекта s3
- Доступ к ведру в ресурсе s3
- Загрузите файл
Очевидно, что это сильно упрощено, но всю документацию можно найти здесь: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html