Django - 媒体上传 [Errno 13] 权限被拒绝

15

我在使用Django上传图片时遇到了一些问题。我的脚本将按日期创建目录,例如:

file = models.FileField(upload_to='uploads/%m-%Y/')
现在,如果我在上传文件夹中创建日期目录并将该文件夹的chmod设置为755,则上传可以正常工作,但是如果我尝试在不创建日期子文件夹(我需要django执行此操作)的情况下对上传文件夹进行chmod,则会出现权限错误。
如何使一个文件夹允许创建子文件夹?
这是一个追踪信息:
Django Version: 1.3
Python Version: 2.5.2
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.admin',
 'tagging',
 'mediamanager',
 'livesettings',
 'projects']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware')


Traceback:
File "/var/lib/python-support/python2.5/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/var/lib/python-support/python2.5/django/utils/decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "/var/lib/python-support/python2.5/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)
File "/var/www/enigma-dev/enigma/mediamanager/views.py" in upload_media
  24.           m.upload_media(data=form.cleaned_data, params=params)
File "/var/www/enigma-dev/enigma/mediamanager/models.py" in upload_media
  63.       self.save()
File "/var/lib/python-support/python2.5/django/db/models/base.py" in save
  460.         self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/var/lib/python-support/python2.5/django/db/models/base.py" in save_base
  543.                         for f in meta.local_fields if not isinstance(f, AutoField)]
File "/var/lib/python-support/python2.5/django/db/models/fields/files.py" in pre_save
  255.             file.save(file.name, file, save=False)
File "/var/lib/python-support/python2.5/django/db/models/fields/files.py" in save
  92.         self.name = self.storage.save(name, content)
File "/var/lib/python-support/python2.5/django/core/files/storage.py" in save
  49.         name = self._save(name, content)
File "/var/lib/python-support/python2.5/django/core/files/storage.py" in _save
  166.             os.makedirs(directory)
File "/usr/lib/python2.5/os.py" in makedirs
  171.     mkdir(name, mode)

Exception Type: OSError at /media-manager/upload/
Exception Value: [Errno 13] Permission denied: '/var/www/site-dev/site/static/uploads/04-2011'
6个回答

27

我之前遇到了同样的错误,修复方法是更改:

MEDIA_ROOT = '/media/'

至:

MEDIA_ROOT = 'media/'

settings.py 文件中。


24

运行Python解释器的进程没有写入媒体目录的权限。您需要将媒体目录的 chgrpchown 与 Python 进程设置为相同的组,并确保目录至少具有 g+rwx 权限,文件具有 g+rw 权限。


1
抱歉,您能告诉我在Ubuntu上查找文件夹权限的命令是什么吗? - Hanpan
2
你如何知道Python进程属于哪个组?谢谢! - Nick Merrill
5
如果您正在运行nginx,通常使用的是www-data用户。因此,“chown www-data:www-data -R media”命令就可以起作用了。在授予权限时,您似乎漏掉了“-R”(递归)选项。 - chhantyal
@chhantyal 非常感谢你,你救了我的一整天 ;) - dzierzak

2

请确保您已经完成以下步骤:

检查您的settings.py文件

...
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
...

同时设置媒体目录的权限

chgrp -R www-data /path/to/media/
chmod -R g+w  /path/to/media/

1

对我来说,我忘记在我的生产服务器上的settings.py文件中添加:MEDIA_ROOT = os.path.join(BASE_DIR,'media')。


0

0
我遇到了相同的错误,并通过在项目的setting.py文件中执行以下操作来修复它:
MEDIA_ROOT = '/media/'

MEDIA_ROOT = 'media/'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接