Im using boto3 and django-storage libraries for apload media files of my django project.
storage_backends.py
class PrivateMediaStorage(S3Boto3Storage):
location = settings.AWS_STORAGE_LOCATION
default_acl = 'private'
file_overwrite = False
custom_domain = False
class PublicStaticStorage(S3Boto3Storage):
location = settings.AWS_PUBLIC_STATIC_LOCATION
settings.py
AWS_STORAGE_LOCATION = 'media/private'
AWS_LOCATION = 'static'
AWS_PUBLIC_STATIC_LOCATION = 'static/'
DEFAULT_FILE_STORAGE = 'path.to.PrivateMediaStorage'
models.py
class Documents(models.Model):
""" uploaded documents"""
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
upload = models.FileField(storage=PrivateMediaStorage())
filename = models.CharField(_('documents name'), max_length=255, blank=True, null=True)
datafile = models.FileField()
created = models.DateTimeField(auto_now_add=True)
type = models.ForeignKey(Doctype, on_delete=models.CASCADE, blank=True)
File loading works well. But there is a point I don't understand, and the link to the file looks wrong (it contains static instead of media). Looks like
https://myhost.s3.amazonaws.com/static/class-descriptions_1.csv
And else about access. Now that I click on the link to the file, I get a message
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>4B8296F8F77491F5</RequestId>
<HostId>
CG96q+LGWcvsIK2YkuaE2wExL8/YTqH1PmjOSFGAqcgaKaTYnOet1QoItGJhW1Oj
</HostId>
</Error>
This is normal for unregistered users, but how do I allow users registered in my Django project to see this file?
You have to use pre-signed URLs to implement this functionality. All users can access S3 objects if the bucket is public. If you want to restrict access, then the bucket has to be private and you need to generate pre-signed URLs per user.
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html