Защитите часть файлового хранилища
Большинство ваших мультимедийных загрузок — например, пользовательские аватары — вы хотите сделать общедоступными. Но если у вас есть какие-либо носители, требующие аутентификации, прежде чем вы сможете получить к ним доступ — скажем, PDF-резюме, которые доступны только для участников, — тогда вам не нужен S3BotoStorage ACL S3 по умолчанию для публичного чтения. Здесь нам не нужно создавать подклассы, потому что мы можем передать экземпляр, а не ссылаться на класс.
так что сначала снимите защиту со всех полей файла в настройках и добавьте контроль кеша
AWS_HEADERS = {
'Cache-Control': 'max-age=86400',
}
# By default don't protect s3 urls and handle that in the model
AWS_QUERYSTRING_AUTH = False
Затем сделайте поле файла, которое вам нужно, защищенным, чтобы использовать ваш собственный защищенный путь.
from django.db import models
import storages.backends.s3boto
protected_storage = storages.backends.s3boto.S3BotoStorage(
acl='private',
querystring_auth=True,
querystring_expire=600, # 10 minutes, try to ensure people won't/can't share
)
class Profile(models.Model):
resume = models.FileField(
null=True,
blank=True,
help_text='PDF resume accessible only to members',
storage=protected_storage,
)
Но вам также нужно использовать свое обычное хранилище, когда вы находитесь в разработке, и вы обычно используете локальное хранилище, так что лично я сделал это так.
if settings.DEFAULT_FILE_STORAGE == 'django.core.files.storage.FileSystemStorage':
protected_storage = FileSystemStorage()
logger.debug('Using FileSystemStorage for resumes files')
else:
protected_storage = S3BotoStorage(
acl='private',
querystring_auth=True,
querystring_expire=86400, # 24Hrs, expiration try to ensure people won't/can't share after 24Hrs
)
logger.debug('Using protected S3BotoStorage for resumes files')
Ссылка: https://tartarus.org/james/diary/2013/07/18/fun-with-django-storage-backends
person
Dr Manhattan
schedule
11.07.2016