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

e0bqpujr  于 2022-12-24  发布在  Go
关注(0)|答案(5)|浏览(211)

我目前有一个简单的模型定义,与photouload功能使用django thumbnails插件。
但是当我尝试上传时,它给了我以下错误:

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守护进程的用户肯定有权读写该目录。
From settings.py

MEDIA_ROOT = '/var/www/sites/gang/http/media/'
MEDIA_ROOT_URL = '/media/'
gfttwv5a

gfttwv5a1#

我刚刚遇到了同样的问题。如果你用Apache作为服务器,我找到了解决方案。例如,如果我的设置是:
媒体根目录= '/var/www/media/geekingreen'
那么我只需要递归地给予那个文件夹正确的权限,以确保任何子文件夹也有相同的权限. apache的默认组是www-data,所以要给我的django应用程序权限,我需要运行这些命令.

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的所有这些文件夹的权限更改为现在具有写权限。显然上传时需要。

希望这能帮助任何可能有过类似问题的人。

flvlnr44

flvlnr442#

试着检查路径中从/开始的每个目录的权限。

rqmkfv5c

rqmkfv5c3#

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/"?
检查www.example.com文件中的媒体根目录和媒体URLsettings.py。
http://docs.djangoproject.com/en/dev/ref/settings/#media-root

lndjwyie

lndjwyie4#

以防您在运行开发服务器时遇到这种情况。我以root用户身份运行开发服务器,如下所示:sudo python manage.py runserver 0.0.0.0:80,以便在同一个局域网中使用iPad测试站点。在该会话中生成该高速缓存文件属于root。因此,当我第二天以非root身份运行项目时,我得到了权限被拒绝的错误。

x7yiwoj4

x7yiwoj45#

您必须修改权限和所有者设置才能让应用上传媒体文件。您应该运行这些命令来授予Django应用权限,因为Apache的默认组是www-data。

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组的成员,它具有读写能力。

相关问题