使用 AWS S3 for django 在 heroku 上提供静态文件?

Posted

技术标签:

【中文标题】使用 AWS S3 for django 在 heroku 上提供静态文件?【英文标题】:Serve static files on heroku using AWS S3 for django? 【发布时间】:2013-12-27 04:10:26 【问题描述】:

我正在使用 heroku 和 AWS S3 为静态文件部署 django 应用程序,问题是我还没有找到有关如何将 heroku 的 Postgres DB 与 S3 服务链接的信息。

我已经设置了 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、S3_BUCKET、添加 CORS 配置,但我的问题是如何将 S3 存储与 Heroku 的 postgres 数据库链接?这可能吗?

这是我的模型在管理员中的样子,但如果我在这里上传图片,5 分钟后就会消失。 Image Upload for the model http://ishopss.com/imageUpload.png

当然我可以使用这样的静态 url,但问题是我想为当然显示不同的图像,而不是为所有人显示相同的图像。 serve in the db http://ishopss.com/for.png

所以我的代码需要是这样的,以提供不同的图像 aws static file http://ishopss.com/course.png

希望有人能帮助我,谢谢。

【问题讨论】:

【参考方案1】:

我在这篇文章中找到了解决方案:

http://blog.doismellburning.co.uk/2012/06/25/django-and-static-files/

http://offbytwo.com/2012/01/18/deploying-django-to-heroku.html

https://devcenter.heroku.com/articles/s3

基本上我需要下载boto(pip install boto)并将其放入requirements.txt(pip freeze > requirements.txt),然后在settings.py中添加:

INSTALLED_APPS = ('storages',)

AWS_ACCESS_KEY_ID = 'xxxxxx'
AWS_SECRET_ACCESS_KEY = 'xxxxxxx'
AWS_STORAGE_BUCKET_NAME = 'bucket_name'


STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

STATIC_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME + '/'

然后你需要设置'AWS_ACCESS_KEY_ID'、'AWS_SECRET_ACCESS_KEY'、'AWS_STORAGE_BUCKET_NAME'

使用

$ heroku config:set AWS_ACCESS_KEY_ID=xxx AWS_SECRET_ACCESS_KEY=yyy
$ heroku config:set S3_BUCKET_NAME=appname-assets

更新 html 中的 src 和 href:

url http://ishopss.com/url.png

最后需要更新https://console.aws.amazon.com/中的权限

【讨论】:

请在模板中使用% static %标签而不是硬编码STATIC_URL。很高兴这篇文章很有用!【参考方案2】:

请看这里:

http://blog.doismellburning.co.uk/2012/07/14/using-amazon-s3-to-host-your-django-static-files/ http://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html

这对您来说可能是最简单的方法。我想 course.image 将从头开始工作。如果没有 - 您可以在 AWS 上创建 CDN 点,并将 CDN url 存储在您的 django 设置文件中。之后,您的 html 应如下所示:

 settings.CDN_URL / course.image 

如果你喜欢糖,并且有时间你可以编写你自己的模板标签,就像这样:

% my_static course,.image % 

【讨论】:

不要对连接进行硬编码(即在模板中使用CDN_URL);相反,使用% static % 标签 - 无论您的存储如何,它都会处理 URL 创建 - staticfiles.productiondjango.com/blog/…

以上是关于使用 AWS S3 for django 在 heroku 上提供静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 和 aws s3 在点击时强制下载图像

使用带有 Compressor 的 Boto 的 Django AWS S3 无法压缩 UncompressableFileError

在 Heroku 上使用 Django 将大文件上传到 AWS S3 存储桶而没有 30 秒的请求超时

尝试访问管理字体文件时,Django 在 AWS S3 中托管静态文件导致 CORS 错误

heroku 上的 Django 和 imagekit 保存到 AWS S3 非常慢

读取和写入存储在 aws s3 (Heroku + Django) 中的数据库文件