31

我正在将我的 django 应用程序转移到 Heroku,我想知道处理静态文件的正确方法是什么。我只是通过 git 将它们推送到 Heroku 吗?或者我应该将它们存储在 SW3 上吗?另外,STATIC_ROOT 等应该是什么?

谢谢!

4

2 回答 2

53

您应该将它们外部存储在 S3 之类的服务上 - 虽然 Heroku可以提供静态文件,但它并非旨在提供服务。

这是一个很好的 S3 入门入门:

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

使用 django-storages http://django-storages.readthedocs.org/en/latest/index.html将静态文件收集到您的 S3 存储桶并相应地提供它们。

这些是 S3 所需的必要设置:

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

AWS_ACCESS_KEY_ID = 'access-id'
AWS_SECRET_ACCESS_KEY = 'secret-key'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
AWS_PRELOAD_METADATA = True # necessary to fix manage.py collectstatic command to only upload changed files instead of all files

MEDIA_ROOT 和 STATIC_ROOT 分别被 DEFAULT_FILE_STORAGE 和 STATICFILES_STORAGE 取代,因此不需要。但是,您需要将 MEDIA_URL 和 STATIC_URL 设置为类似

STATIC_URL = 'https://bucket-name.s3.amazonaws.com/static/'
ADMIN_MEDIA_PREFIX = 'https://bucket-name.s3.amazonaws.com/static/admin/'

如果您想将静态和媒体文件存储在不同的子文件夹中,这是一个很好的解决方案:https ://stackoverflow.com/a/10825691/674794

您需要将 MEDIA_URL 和 STATIC_URL 设置为各自的新文件夹,例如

MEDIA_URL = 'https://bucket-name.s3.amazonaws.com/media/'
STATIC_URL = 'https://bucket-name.s3.amazonaws.com/static/'

您还需要手动执行 manage.py collectstatic 并按照https://devcenter.heroku.com/articles/django-assets#disabling_collectstatic禁用 Heroku 的自动 collectstatic ,因为 Heroku 的 collectstatic 每次您都会将每个静态文件重新上传到 S3即使文件没有被修改也推送,增加大量的传输和请求负载到 S3 并减慢你的推送速度。

然后像往常一样继续在您的模板中使用 {{ STATIC_URL }} ,您应该已经设置好了!

<link href='{{ STATIC_URL }}css/styles.css' type='text/css' rel='stylesheet'>

如果您想从简单开始并选择不立即采取该路线,您可以按照 Cesar 在Heroku - 处理 Django 应用程序中的静态文件的帖子中提到的帖子在您的 urls 配置中进行快速破解,尽管会显着减少在应用性能方面。

于 2012-07-21T07:42:31.553 回答
1

虽然如果您有很多静态内容,@Intenex 的答案可能仍然是要走的路,但 Heroku 建议使用 Whitenoise。

这是 Heroku 的文章,标题为“ Django and Static Assets ”。

并且白噪声文档本身有一个很好的部分关于“我不应该使用 Django-Storages 之类的东西将我的静态文件推送到 S3 吗?

于 2020-08-10T23:46:30.807 回答