我目前定义了一个简单的模型,使用django thumbnails插件的photoupload功能。
但是当我尝试上传时,会出现以下错误:
OSError at /admin/products/photo/add/
(13, 'Permission denied')
现在,我知道这似乎是一个权限问题,所以我检查的第一件事是对目录的权限,并将这些更改为777(只是测试),重新启动服务器和fcgi,它仍然给出错误。
回溯
Traceback: File "/usr/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
92. response = callback(request, *callback_args,
**callback_kwargs) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/options.py" in wrapper
226. return self.admin_site.admin_view(view)(*args,
**kwargs) File "/usr/lib/python2.6/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func
44. response = view_func(request, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in inner
186. return view(request, *args, **kwargs) File "/usr/lib/python2.6/dist-packages/django/db/transaction.py" in _commit_on_success
240. res = func(*args, **kw) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/options.py" in add_view
734. self.save_model(request, new_object, form, change=False) File "/usr/lib/python2.6/dist-packages/django/contrib/admin/options.py" in save_model
557. obj.save() File "/usr/lib/python2.6/dist-packages/django/db/models/base.py" in save
410. self.save_base(force_insert=force_insert, force_update=force_update) File "/usr/lib/python2.6/dist-packages/django/db/models/base.py" in save_base
483. values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)] File "/usr/lib/python2.6/dist-packages/django/db/models/fields/files.py" in pre_save
252. file.save(file.name, file, save=False) File "/var/www/django_projects/gang/../gang/products/thumbs.py" in save
84. super(ImageWithThumbsFieldFile, self).save(name, content, save) File "/usr/lib/python2.6/dist-packages/django/db/models/fields/files.py" in save
91. self.name = self.storage.save(name, content) File "/usr/lib/python2.6/dist-packages/django/core/files/storage.py" in save
47. name = self._save(name, content) File "/usr/lib/python2.6/dist-packages/django/core/files/storage.py" in _save
146. os.makedirs(directory) File "/usr/lib/python2.6/os.py" in makedirs
150. makedirs(head, mode) File "/usr/lib/python2.6/os.py" in makedirs
150. makedirs(head, mode) File "/usr/lib/python2.6/os.py" in makedirs
150. makedirs(head, mode) File "/usr/lib/python2.6/os.py" in makedirs
157. mkdir(name, mode)
Exception Type: OSError at /admin/products/photo/add/ Exception Value: (13, 'Permission denied')
正在运行FCGI守护程序的用户肯定有访问该目录的读写权限。
来自settings.py
MEDIA_ROOT = '/var/www/sites/gang/http/media/'
MEDIA_ROOT_URL = '/media/'
答案 0 :(得分:64)
我刚遇到同样的问题。如果您使用Apache作为服务器托管,则找到解决方案。例如,如果我的设置是:
MEDIA_ROOT ='/ var / www / media / geekingreen'
然后我只需要递归地为该文件夹提供正确的权限,以确保任何子文件夹也具有相同的权限。 apache的默认组是www-data,所以为了给我的django app提供权限,我会运行这些命令。
cd /var/www/media
chgrp -R www-data geekingreen/
chmod -R g+w geekingreen/
chgrp -R www-data geekingreen / 命令将目录geekingreen和所有子目录更改为具有组www-data。
chmod -R g + w geekingreen / 命令更改该组对现在属于www-data的所有这些文件夹的权限,现在具有写入权限。显然需要上传。
希望这可以帮助任何可能遇到类似问题的人。
答案 1 :(得分:8)
尝试检查从/开始的路径中每个目录的权限。只是一个想法。
答案 2 :(得分:2)
mkdir(name, mode)
Exception Type: OSError at /admin/products/photo/add/
但您的应用程序部署在
/var/www/django_projects/gangr/../gangr/
您是否将目录路径设置为绝对路径“/ admin / products / photo / add /”而不是像“admin / products / photo / add /”这样的相对路径?
检查settings.py文件中的MEDIA_ROOT和MEDIA_URL。
http://docs.djangoproject.com/en/dev/ref/settings/#media-root
答案 3 :(得分:2)
以防万一在运行开发服务器时遇到此问题。
我以root身份运行开发服务器:sudo python manage.py runserver 0.0.0.0:80
,以便在同一LAN网络中使用iPad测试网站。
该会话中生成的缓存文件属于root。因此,当我第二天运行项目而不是root用户时,我得到了权限被拒绝错误。
答案 4 :(得分:0)
为了让您的应用能够上传媒体文件,您需要更改权限和所有者设置。 apache 的默认组是 www-data,因此要授予 Django 应用程序权限,您应该运行这些命令。
sudo groupadd www-data
sudo adduser www-data www-data
sudo chgrp -R www-data media
sudo chown -R www-data media
sudo chmod -R 770 media
一步一步,这将创建一个名为“www-data”的新用户组,将用户 www-data 添加到该组,将媒体的用户组更改为“www-data”,最后更改所有者权限到 770,它允许对所有者(root)和所有者组(www-data)的读取、写入和执行权限,而其他任何人都没有访问权限。因为 www-data 加入了 www-data 组,所以 www-data 现在可以读写了。