我收到了一条消息
[Errno 13]权限被拒绝:u'/ home / ... / ... jpg'当我尝试在django上传文件时。但问题只有在我使用localhost /尝试时才会出现。当我使用localhost:8000运行或调试它时,我没有遇到任何问题。
当我运行脚本来设置数据库时,我使用函数创建文件夹。
我的代码:
def handle_uploaded_file(request,f):
user=Users.objects.get(id_u=request.user.id)
url=settings.MEDIA_URL+'images/'+user.mail+'/gallery/'+f.name
fullurl=settings.MEDIA_ROOT+'images/'+user.mail+'/gallery/'+f.name
#comprobar si existe el archivo
if not os.path.exists(fullurl):
destination = open(fullurl, 'wb+')
...
destination.close()
文件夹媒体中的权限。我想将文件上传到'images'文件夹。在这里,我看到其他人没有权限写,但up文件夹有777.那么,为什么我的脚本在创建子文件夹时会更改权限?
4 drwxrwxrwx 3 bernardo www-data 4096 ago 3 09:42 .
4 drwxrwxr-x 11 bernardo www-data 4096 jul 31 12:36 ..
4 drwxrwxr-x 5 bernardo bernardo 4096 ago 3 09:42 images
我的http.config
ServerName localhost
WSGIPythonPath /home/bernardo/workspace/mbosoziales
Alias /media/ /home/bernardo/workspace/mbosoziales/media/
Alias /static/ /home/bernardo/workspace/mbosoziales/static/
<Directory /home/bernardo/workspace/mbosoziales/static>
Order deny,allow
Allow from all
</Directory>
<Directory /home/bernardo/workspace/mbosoziales/media>
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / /home/bernardo/workspace/mbosoziales/mbosoziales/wsgi.py
<Directory /home/bernardo/workspace/mbosoziales/mbosoziales>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
因此,每次运行为用户创建文件夹的第一个脚本后,我必须更改权限,因为他们没有权限在媒体文件夹中写入,但我认为权限是正确的。
sudo chgrp -R www-data images/
chmod -R o+w images/
任何帮助将不胜感激。抱歉我的英语:)
添加完整例外: 环境:
Request Method: POST
Request URL: localhost:8000/user/upload/
Django Version: 1.4
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'admin',
'login',
'suchen',
'user',
'photologue')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py" in _wrapped_view
20. return view_func(request, *args, **kwargs)
File "/home/bernardo/workspace/mbosoziales/user/views.py" in upload
332. handle_uploaded_file(request,request.FILES['file'])
File "/home/bernardo/workspace/mbosoziales/user/views.py" in handle_uploaded_file
344. destination = open(fullurl, 'wb+')
Exception Type: IOError at /user/upload/
Exception Value: [Errno 13] Permission denied: u'/home/bernardo/workspace /mbosoziales /media/images/bern@ardo.com/gallery/list.csv'
答案 0 :(得分:7)
当您使用runserver
时,该过程将以普通用户身份运行;并且此用户可以访问/home/username/
来创建文件夹和文件。
当您在Apache下运行它时,代码将作为apache进程运行 - 通常为www-data
,并且该用户无权访问您的主目录下的创建文件夹。
即使可行,解决方案 <{1}}也是如此。有两种更好的方法可以解决这个问题:
对于生产用途,请将文件路径更改为chmod 777
用户通常拥有权限的目录;并且不应该是您的主目录。
如果您必须使用主目录下的位置;创建新路径并将其父级所有者设置为www-data
。这样,它就可以在不提供一揽子www-data:www-data
权限的情况下工作。
答案 1 :(得分:0)
你在这里创建的文件是否有可能;
destination = open(fullurl, 'wb+')
当您尝试执行代码时,已经创建并打开或在某处使用?
答案 2 :(得分:0)
我认为不,因为在我之前
if not os.path.exists(fullurl):
所以,只有在没有文件时才会打开。我已经调试了好几次并且工作正常,但是权限存在问题。 现在我找到了一个解决方法
os.chmod(url,0777)
我第一次运行服务器并创建文件夹。