#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. Спасибо за комментарий, я могу решить по-другому, но я оценил вашу помощь.