小编典典

在Heroku上处理Django静态文件和模板的正确方法

python

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

谢谢!


阅读 173

收藏
2021-01-20

共1个答案

小编典典

您应该将它们外部存储在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/'

如果要将静态文件和媒体文件存储在不同的子文件夹中,这是一个很好的解决方案:4760

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

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

您还需要按照https://devcenter.heroku.com/articles/django-
assets#disabling_collectstatic手动执行manage.py
collectstatic并禁用Heroku的自动collectstatic
,因为Heroku的collectstatic会在您每次将静态文件重新上传到S3时即使未修改文件,也要进行推送,这会增加大量传输并向S3请求加载,从而降低了推送速度。

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

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

如果您想从简单开始并且选择不立即采取这种方法,则可以按照Cesar在Heroku上提到的文章-在Django应用程序中处理静态文件来对url配置进行快速修改,尽管会大大减少在应用程序性能方面。

2021-01-20