我正在将我的django应用程序移到Heroku上,我想知道处理静态文件的正确方法是什么。我只是通过git将它们推送到Heroku吗?或者我应该将它们存储在SW3或其他东西上?另外,STATIC_ROOT应该是什么?
谢谢!
答案 0 :(得分:49)
你应该将它们外部存储在像S3这样的服务上 - 而Heroku 可以提供静态文件,但它不适用于。
这是一个关于S3入门的好入门书:
https://devcenter.heroku.com/articles/s3
使用django-storage 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的自动收集器,因为Heroku的collectstatic每次都会将每个静态文件重新上传到S3即使文件没有被修改,你也会推送,向S3添加大量转移和请求加载,并减慢推送速度。
然后就像往常一样继续在模板中使用{{STATIC_URL}},你就应该设置好了!
<link href='{{ STATIC_URL }}css/styles.css' type='text/css' rel='stylesheet'>
如果您想从简单开始并选择不立即采取该路线,您可以按照Cesar在Heroku - Handling static files in Django app上提到的帖子快速破解您的网址配置,尽管有&#39 ;应用程序性能显着下降。
答案 1 :(得分:0)
如果您有很多静态内容,@ Intenex的答案可能仍然是解决方法,但起步时,Heroku建议使用Whitenoise。
这是Heroku的文章,标题为“ Django and Static Assets”。
whitenoise文档本身在“ Shouldn’t I be pushing my static files to S3 using something like Django-Storages?”中有一个不错的部分