Защитете малко място за съхранение на файлове
Повечето от вашите медийни качвания – потребителски аватари, например – искате да бъдат публични. Но ако имате някаква медия, която изисква удостоверяване, преди да имате достъп до нея – да речем PDF автобиографии, които са достъпни само за членове – тогава не искате стандартният S3 ACL на S3BotoStorage за публично четене. Тук не е нужно да правим подкласове, защото можем да предадем инстанция, вместо да препращаме към клас.
така че първо премахнете защитата за всички файлови полета във вашите настройки и добавете контрол на кеша
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,
)
Но вие също трябва да използвате нормалното си хранилище, когато сте в Dev, и обикновено използвате локално хранилище, така че аз лично го направих така
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')
REF: https://tartarus.org/james/diary/2013/07/18/fun-with-django-storage-backends
person
Dr Manhattan
schedule
11.07.2016