首页 > 解决方案 > 通过 Django 管理控制台上传的文件权限错误

问题描述

我的网站的一部分被封锁,只是作为我制作的项目的存储库/免费托管服务。我在我的网站中有一个personal专门用于此的简单 Django 项目 - 理想情况下,该过程是

  1. 通过管理控制台(通过) 将文件上传到personal数据库mysite.com/admin
    • 这保存在/static/media/personal/[foldername]/myproject
  2. 为该文件分配一个短标签(例如myproject
  3. 现在,任何人都应该可以访问该文件mysite.com/personal/myproject,这将重定向到我上传的静态文件。

我的问题是我上传的文件是用权限保存的0600,所以当我稍后尝试用我的网络浏览器访问它们时,我得到一个 403 Forbidden 错误。我可以手动进入服务器并将权限更改为0644然后它工作正常,但我希望 Django 为我做这件事。


我已经尝试将以下内容放入我的网站settings.py文件中:

FILE_UPLOAD_PERMISSIONS = 0o644

这是我能够通过研究找到的唯一真实的东西,我可以理解。不幸的是,这似乎没有帮助。我用于此personal数据库的模型如下:

def generate_filename(instance, filename):
    if instance.folder and len(instance.folder) > 0:
        return os.path.join('personal', instance.folder, filename)
    else:
        return 'personal/{}'.format(filename)


class PersonalFile(models.Model):
    """
    A model type representing a single file. Contains only that
    file object.
    """
    def __str__(self):
        return "{} ---> {}".format(self.name, str(self.file))

    """ The url for accessing this file """
    name = models.CharField(max_length=200)
    """ A description for this project """
    description = models.TextField(blank=True, null=True)
    """ Whether this item should be displayed on the projects index """
    display = models.BooleanField(default=True)
    """ A folder for this object to be placed in """
    folder = models.CharField(max_length=200, blank=True, null=True, default=None)
    """ The actual media url of the file """
    file = models.FileField(upload_to=generate_filename)

请注意,我没有遇到文件夹获得错误权限的问题,只是应该放入其中的文件。

我正在使用标准的 Django/gunicorn/nginx 堆栈进行部署。为简单起见,我想在 Django 级别处理这个问题,但如果修改一些 nginx 配置文件或其他东西更容易,那也可以。

标签: djangopython-3.x

解决方案


推荐阅读