абсолютный путь? `загрузка_то` моделей.Поле файла

#python #django

Вопрос:

У меня есть FileField в models.py

 class DocFile(models.Model):
    document = models.FileField(upload_to='_mat/')
 

Он хорошо работает для локального(mac),и файл хранится под /Users/whitebear/myproj/_mat/

Однако я делаю то же самое на сервере (Ubuntu 20, используя ENGINX-модуль)

Это показывает ошибку 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/')
 

Там сказано использовать «относительный путь»

Это трассировка стека ошибок.

     response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/var/www/html/aicomposer/current/defapp/views.py", line 350, in post
    entry.save()
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/base.py", line 763, in save_base
    updated = self._save_table(
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/base.py", line 868, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/base.py", line 906, in _do_insert
    return manager._insert(
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/query.py", line 1270, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1415, in execute_sql
    for sql, params in self.as_sql():
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1358, in as_sql
    value_rows = [
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1359, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1359, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1310, in pre_save_val
    return field.pre_save(obj, add=True)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/fields/files.py", line 302, in pre_save
    file.save(file.name, file.file, save=False)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/db/models/fields/files.py", line 89, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/core/files/storage.py", line 54, in save
    return self._save(name, content)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/site-packages/django/core/files/storage.py", line 255, in _save
    os.makedirs(directory, exist_ok=True)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/os.py", line 213, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "/home/ubuntu/anaconda3/envs/aiwave/lib/python3.8/os.py", line 223, in makedirs
    mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/_mat'
 

Комментарии:

1. Какова ваша MEDIA_ROOT установка?

2. Я предполагаю, что первый / в вашем upload_to параметре должен быть удален, это сделает путь абсолютным

3. Спасибо за ваш комментарий, MEDIA_ROOT был причиной этой проблемы.

Ответ №1:

MEDIA_ROOT Параметр [Django-doc] определяет:

Абсолютный путь к файловой системе к каталогу, в котором будут храниться загруженные пользователем файлы.

Таким образом, вы должны указать с помощью этого параметра, где вы будете хранить медиафайлы. Если MEDIA_ROOT это так / , то он сохранит их в /_mat/ каталоге сервера.

Таким образом, вы можете установить MEDIA_ROOT значение:

 # settings.py

# ⋮,

MEDIA_ROOT = '/var/www/html/myproj/'

# ⋮ 

Комментарии:

1. Спасибо, я установил MEDIA_ROOT , однако это не решено

2. Вы правы, после перезагрузки сервера это работает. Большое спасибо!!!!

Ответ №2:

отказано в разрешении, я думаю, исходит из файловой системы ubuntu, поэтому вы можете запустить

sudo chmod -R 755 /var/www/html/myproj/_mat/

и лучше также сделать пользователя Nginx таким же, как gunicorn, и предоставить этому пользователю доступ к вашим медиа, как показано ниже, пусть ваш пользователь является пользователем 1

sudo chown -R пользователь1:пользователь1 /var/www/html/myproj/_mat/

Комментарии:

1. Спасибо за комментарий, я могу решить по-другому, но я оценил вашу помощь.