上传文件时Django的权限被拒绝错误

ism*_*ail 22 django permissions

我目前有一个简单的模型定义,使用django缩略图插件的photoupload功能.

但是当我尝试上传时,它给出了以下错误:

OSError at /admin/products/photo/add/

(13, 'Permission denied')
Run Code Online (Sandbox Code Playgroud)

现在,我知道这似乎是一个权限问题,所以我检查的第一件事是对目录的权限,并将这些更改为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')
Run Code Online (Sandbox Code Playgroud)

正在运行FCGI守护程序的用户肯定有访问该目录的读写权限.

来自settings.py

MEDIA_ROOT = '/var/www/sites/gang/http/media/'
MEDIA_ROOT_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

小智 67

我刚遇到同样的问题.如果您使用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/
Run Code Online (Sandbox Code Playgroud)

chgrp命令-R www数据geekingreen /命令改变目录geekingreen和任何子目录具有组WWW的数据.
搭配chmod -R G + w ^ geekingreen /命令改变什么权限的组对所有这些文件夹,现在属于www数据的,到现在已经有写权限.显然需要上传.

希望这可以帮助任何可能遇到类似问题的人.


Pet*_*ell 9

尝试检查从/开始的路径中每个目录的权限.只是一个想法.

  • 呃,我相信我说'检查',而不是'改变'......差别很大.我见过以下情况:你的DOCROOT在/ a/b/c/d.'d'是777(通常通过绝望),'a'和'b'是755(正常),但'c'是700(或类似),几乎结束了聚会.你继续玩'd',但问题是'c'(或其他). (5认同)
  • 嗨,彼得,改变根目录的权限似乎有点不安全? (2认同)