我正在将django应用程序移至Heroku,我想知道处理静态文件的正确方法是什么。我是否只是通过git将它们推送到Heroku?还是应该将它们存储在SW3上?另外,STATIC_ROOT等应该是什么?
谢谢!
您应该将它们外部存储在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配置进行快速修改,尽管会大大减少在应用程序性能方面。