您可以使用S3 Amazon来存储静态和媒体文件,这将更好。
S3 Amazon存在的问题
将S3存储桶显示为文件系统的一部分具有可怕的性能,并且随机失败。当我们复制大量文件时,需要花费10、15或20分钟才能完成复制,使得在不需要时部署需要很长时间。如果直接发送到S3中,相同的复制命令只需约1分钟即可完成。
解决方案
对S3BotoStorage进行两次子类化,一个用于静态文件,另一个用于媒体文件,这允许我们为每种类型使用不同的存储桶和子目录(参见:custom_storage.py)。
更新设置
1. AWS_STORAGE_BUCKET_NAME needs to be bucket to hold static files and media files
2. MEDIAFILES_BUCKET
3. MEDIAFILES_LOCATION
4.DEFAULT_FILE_STORAGE
5.STATICFILES_BUCKET
6.STATICFILES_LOCATION
This is the subdirectory under the S3 bucket for the app
7.STATIC_URL
8.STATICFILES_STORAGE
创建
custom_storage.py 文件,并填入以下内容:
from django.utils.deconstruct import deconstructible
from storages.backends.s3boto import S3BotoStorage
from django.conf import settings
@deconstructible
class StaticS3Storage(S3BotoStorage):
bucket_name = settings.STATICFILES_BUCKET
location = settings.STATICFILES_LOCATION
@deconstructible
class MediaS3Storage(S3BotoStorage):
bucket_name = settings.MEDIAFILES_BUCKET
location = settings.MEDIAFILES_LOCATION
以下是更新 settings.py.tmpl 的示例,根据我的 stack.json 进行设置(如上所述)。
MEDIAFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>'
MEDIAFILES_LOCATION = 'folder_name_for_media_files_in_bucket'
DEFAULT_FILE_STORAGE = 'custom_storage.MediaS3Storage'
if DEFAULT_FILE_STORAGE == "custom_storage.MediaS3Storage":
MEDIA_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' % (MEDIAFILES_BUCKET, MEDIAFILES_LOCATION)
else:
MEDIA_URL = '/media/'
STATICFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>'
STATICFILES_LOCATION = 'folder_name_for_static_files_in_bucket'
STATICFILES_STORAGE = '<%= @node["deploy_data"]["project_name"]["django_static_files_storage"] %>'
if STATICFILES_STORAGE == "custom_storage.StaticS3Storage":
STATIC_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' % (STATICFILES_BUCKET, STATICFILES_LOCATION)
else:
STATIC_URL = '/static/'
使用staticfiles Django模板标签加载静态文件
在模板中将所有的{% load static %}替换为{% load static from staticfiles %}
使用“static”从静态文件中可以利用不同的后端文件,包括S3后端或本地文件后端。使用“load static”使用Django模板标签库,该库无法处理不同的后端。
在包含静态文件时,在模板中使用“static from staticfiles”:
{% static “path/to/the/file.ext” %}
这将找出文件的完整路径,如果它在S3中,则会插入文件的完整URL。
示例
<link rel="stylesheet" type="text/css" href="{% load static from staticfiles %}{% static "css/style.css" %}”>
有用信息
“django.contrib.staticfiles.storage.StaticFilesStorage” 是Django默认的静态文件后端。
参考资料
https://docs.djangoproject.com/zh-hans/1.9/howto/static-files/
https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/