Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django+;S3签名过期_Django_Amazon S3_Boto3_Django Storage - Fatal编程技术网

Django+;S3签名过期

Django+;S3签名过期,django,amazon-s3,boto3,django-storage,Django,Amazon S3,Boto3,Django Storage,我的django存储实例是否应该将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

我的django存储实例是否应该将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)
存储_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\u 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\u S3\u ADDRESSING\u STYLE
之类的文档不是很好,但这是我错过了一段时间的文档&它会导致一些东西被存储在我的存储桶中意外的位置。我想我看到了
//我想我已经让它与上面的代码一起工作了,因为它只存储图像文件名,而不存储参数。然而,当我调用图像时,它看起来仍然在缓存旧签名。AWS_S3_OBJECT_PARAMETERS={'CacheControl':'max age=86400',}是否与签名缓存有关?@Kowalski No,
AWS_S3_OBJECT_PARAMETERS
与签名无关。这是为了告诉浏览器如何缓存文件。