如何将Django的输出文件保存到Amazon S3?

4
作为该过程的一部分,我的网站从pandas数据框创建了一个csv文件 -

df.to_csv()

由于应用程序部署在Heroku上,这里没有持久文件存储,我想将其保存到Amazon S3。我已经为上传的文件和静态文件设置了此项功能,但无法使其对此起作用。非常感谢任何帮助。
2个回答

1
也许你可以使用 django-storages 将文件保存到 Amazon S3。像这样将你的 AWS 凭证添加到配置文件中:
heroku config:add AWS_ACCESS_KEY_ID='your_key_here'
heroku config:add AWS_SECRET_ACCESS_KEY='your_secret_here'
heroku config:add AWS_STORAGE_BUCKET_NAME='your_bucket_name_here'

并且可以像这样在您的 settings.py 中检索它们:
AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')

更新:您可以尝试使用StringIO来执行类似以下操作的功能:
from django.core.files.base import ContentFile
from StringIO import StringIO

output = StringIO()
df.to_csv(output)
mymodel.myfield.save('django_test.csv', ContentFile(output.getvalue()))

1
我正在使用django-storages来处理静态和上传的媒体文件,这方面工作得很好。但是我该如何使用它来保存程序运行中创建的文件呢?df.to_csv(s3_storage.open(...))似乎行不通... - NigelLegg
我认为你需要类似这样的代码:with open(csv_filename, 'rb') as f:mymodel.myfield.save('django_test.csv', File(f), save=True) - Zemogle

1

看看Boto。代码非常简单,您不必担心将文件写出,只需直接发布即可。

heroku config:add AWS_ACCESS_KEY_ID='your_key_here'
heroku config:add AWS_SECRET_ACCESS_KEY='your_secret_here'

Boto会自动使用配置文件:
import boto
filecontents = "colm1, colm2, etc"
c = boto.connect_s3()
b = c.get_bucket('mybucket') # substitute your bucket name here
from boto.s3.key import Key
k = Key(b)
k.key = filecontents
k.get_contents_as_string()
'colm1, colm2, etc'

阅读更多:http://boto.readthedocs.org/en/latest/s3_tut.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接