У меня есть раздел моего сайта, оцепленный просто как репозиторий / бесплатный хостинг для проектов, которые я делаю. У меня есть простой проект Django под названием personal
, посвященный этому на моем веб-сайте - процесс, в идеале, это
- Загрузить файл в базу данных
personal
через консоль администратора (через mysite.com/admin
)
- сохраняется в
/static/media/personal/[foldername]/myproject
- Назначьте этому файлу короткий тег (например,
myproject
)
- Теперь этот файл должен быть доступен любому на
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 или что-то еще, то это тоже сработало бы.