首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django + S3签名过期

Django + S3签名过期
EN

Stack Overflow用户
提问于 2020-08-24 02:10:24
回答 1查看 366关注 0票数 0

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

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

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
class PrivateMediaStorage(S3Boto3Storage):
    location = 'private'
    default_acl = 'private'
    file_overwrite = False
    custom_domain = False

抱歉,我是Django的新手,我想确认一下我的逻辑是否正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-24 03:26:34

不,你不希望它存储这样的数据,因为那样你将失去对文件的访问权限。我以前就遇到过这样的问题。

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

这些是我对私有S3存储桶的设置,无需保存签名即可工作;

代码语言:javascript
复制
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

你在你的自定义存储类中定义的一些设置,我在保存子分类的设置中有。

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

代码语言:javascript
复制
photo = models.ImageField(
    verbose_name=_('photo'),
    upload_to='photos',
    default=None,
    blank=True,
    null=True,
)

在我的upload_to是可调用的字段上,我有这些方法;

代码语言:javascript
复制
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类型的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63550448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档