【问题标题】:django-storages + private S3 bucket - How can I make a username the folder name?django-storages + private S3 bucket - 如何将用户名设为文件夹名称?
【发布时间】:2019-07-05 13:59:15
【问题描述】:

我正在使用 django-storages 和私有 S3 存储桶来存储用户上传的内容。我想要以下文件夹结构:

/uploads/someuser321/20190112-123456/

我显然知道如何做时间戳(2019-01-12 at 12:34:56),但是如何将用户的用户名放入路径中?我的模型目前看起来像这样:

user_file = models.FileField(
    upload_to="uploads", 
    storage=PrivateMediaStorage(), 
    null=True, blank=True)

我可以为日期时间/时间戳添加一个 f 字符串。我明白这一点,我知道该怎么做。但是如何将用户的用户名也添加为文件夹?我需要以某种方式从视图中访问它,以便我知道 request.user 是谁,但我该怎么做呢?

【问题讨论】:

    标签: django amazon-s3 django-models boto3 python-django-storages


    【解决方案1】:

    您需要在upload_to 中进行函数调用。这是一个可以为您提供路径的函数:

    def get_file_path(instance, filename):
        today = localtime(now()).date()
        return '{0}/uploads/{1}/{2}'.format(instance.user.username, today.strftime('%Y/%m/%d'), filename)
    

    然后你需要在你的模型中这样调用它:

    user_file = models.FileField(
        upload_to=get_file_path, 
        storage=PrivateMediaStorage(), 
        null=True, blank=True)
    

    您需要修复该 return 语句以获得所需的格式,但这样做可以。 Django 会自动将一个实例传递给你的函数和文件名。

    希望对你有帮助!

    【讨论】:

    • 哦,这很漂亮。我只需要将它调整到我的模型,它就可以立即工作。非常感谢!!
    • 这会阻止访问另一个用户 ID 的文件吗?这会自动处理吗?
    • 不确定你的意思@ViktorVostrikov。此代码基本上是生成包含用户名的路径,以便每个用户都可以拥有自己的文件夹。它与访问没有任何关系。访问文件时,您需要在视图内部进行处理。
    • 但是,如果我不添加任何保护,那么用户可以猜测/暴力破解我的 S3 文件路径并下载其他用户的文件。我怎样才能防止这种情况发生?
    • @ViktorVostrikov 我从我的使用本地存储的项目中获得了这段代码。我在 Nginx 中有一个受保护的文件夹,并且为了获取文件,用户通过一个视图检查他们的权限并发送 X-Access 标头到 Nginx 指示它提供文件。但是使用 S3,您需要通过 boto 生成签名 URL。但是,django-storages 似乎为您抽象了这个。看到这个github.com/jschneier/django-storages/blob/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2012-11-14
    相关资源
    最近更新 更多