Абсолютный путь? `upload_to` из models.FileFIeld
У меня есть FileField
в models.py
class DocFile(models.Model):
document = models.FileField(upload_to='_mat/')
Хорошо работает для локальной сети (mac), и файл хранится под /Users/whitebear/myproj/_mat/
Однако я делаю то же самое на сервере (Ubuntu 20, использую ENGINX-unit)
Выдает ошибку PermissionError: [Errno 13] Permission denied: '/_mat'
Но, /var/www/html/myproj/_mat/
разрешение 777
Полагаю, что каким-то образом он пытается сделать /_mat
абсолютным путем...????
Если я устанавливаю upload_to
таким образом,
document = models.FileField(upload_to='/var/www/html/myproj_mat/')
Здесь говорится об использовании "относительного пути"
Это трассировка стека ошибок.
Настройка MEDIA_ROOT
[Django-doc] определяет:
Абсолютный путь файловой системы к каталогу, в котором будут храниться загруженные пользователем файлы.
Вы должны указать в этом параметре, где вы будете хранить медиафайлы. Если MEDIA_ROOT
будет /
, то он будет хранить их в /_mat/
директории сервера.
Таким образом, вы можете установить настройку MEDIA_ROOT
на:
# settings.py
# ⋮,
MEDIA_ROOT = '/var/www/html/myproj/'
# ⋮
permission denied я думаю, что это происходит из-за файловой системы ubuntu. так что вы можете запустить
sudo chmod -R 755 /var/www/html/myproj/_mat/
и лучше также сделать пользователя Nginx таким же, как gunicorn и дать этому пользователю доступ к вашим носителям как показано ниже, пусть ваш пользователь будет user1
sudo chown -R user1:user1 /var/www/html/myproj/_mat/