Django + S3签名到期

问题描述

我的django-storage实例是否应该将S3签名与图像名称一起存储在数据库中?

如果是这样,假设旧的请求已过期,您如何在每个请求上重新生成新密钥?

models.py

def user_directory_path(self,filename):
    return 'profile/user_{0}/images/profile/{1}'.format(self.user.id,filename)
    ...
    ...
    user_image = models.ImageField(upload_to=user_directory_path,storage=PrivateMediaStorage(),blank=True)

storage_backends.py

class PrivateMediaStorage(S3Boto3Storage):
    location = 'private'
    default_acl = 'private'
    file_overwrite = False
    custom_domain = False

对不起Django新手,要确保我的逻辑正确。

解决方法

不,您不希望它存储这种数据,因为那样您将无法访问文件。过去我遇到过这个确切的问题。

签名应由系统在需要访问文件时添加。

这些是我的设置,适用于私有S3存储桶,而无需保存签名;

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

S3_BUCKET = env('S3_BUCKET','my_bucket')
S3_SUB_BUCKET = env('S3_SUB_BUCKET','dev')
S3_REGION = env('S3_REGION','eu-west-2')
AWS_REGION = env('AWS_REGION','eu-west-2')
S3_USE_SIGV4 = True

AWS_S3_PATH_SEPARATOR = '/'
AWS_STORAGE_BUCKET_NAME = S3_BUCKET
AWS_S3_HOST = f'{S3_BUCKET}.s3.{S3_REGION}.amazonaws.com'
AWS_S3_SIGNATURE_VERSION = 's3v4'
AWS_S3_ADDRESSING_STYLE = 'virtual'
AWS_DEFAULT_ACL = 'private'
AWS_LOCATION = S3_SUB_BUCKET
AWS_S3_FILE_OVERWRITE = False

您在自定义存储类中定义的某些设置,在我保存子类的设置中具有。

当我使用文件/图像字段时,我就这样做;

photo = models.ImageField(
    verbose_name=_('photo'),upload_to='photos',default=None,blank=True,null=True,)

在我的upload_to可调用的字段上,我有以下方法;

def uuid():
    """ Generate a UUID """
    return urlsafe_b64encode(uuid4().bytes).decode("ascii").rstrip("=")


def upload_path(instance,filename):
    """ Upload to path with UUID """
    return "{uuid}/{file}".format(uuid=uuid(),file=filename)

诸如AWS_S3_ADDRESSING_STYLE之类的文档并不出色,但是那是我一阵子错过的文档,它导致事物存储在存储桶中意外的位置。我想我在没有该设置的情况下看到了<bucket>/<bucket>/<path_to_file类型的问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...