django manage.py 脚本搞乱了目录权限

1 投票
2 回答
931 浏览
提问于 2025-04-19 02:48

我有一个脚本,它会检查一个json文件,然后把照片下载到一个文件夹里。

这段代码是用来检查文件夹是否存在,如果不存在就创建它:

folder = media_root + 'photos/' + now.strftime('%Y') + '/' + now.strftime('%m') + '/' + now.strftime('%d')

if not os.path.isdir(folder):
    os.makedirs(folder)

一切都按预期工作,但现在通过django的管理界面无法写入这个文件夹,出现了错误OSError: [Errno 13] Permission denied: media/photos/2014/08/31/OneOf.jpg

唯一能让它正常工作的办法是把权限设置为所有人都可以写。我检查了一下,发现gunicorn是以nobody这个用户在运行,这之前从来没有出现过问题。

是什么导致了这个问题,我该如何防止它再次发生呢?

编辑:

我尝试了下面的建议,但以nobody身份运行脚本只返回了一个错误:

 File "./manage.py", line 8, in <module>
      from django.core.management import execute_from_command_line
 ImportError: No module named django.core.management

我还检查了一下,其他通过django-admin界面创建的文件夹也是由root拥有的。

解决方案:

os.makedirs命令把整个目录树的拥有权都改成了root,这就是为什么即使权限和其他文件夹一样,django也无法写入那个目录。

为了防止这种情况再次发生,解决办法是在新文件夹创建后,恢复那个目录树的拥有权。

2 个回答

2

要解决你的第一个问题,可以按照以下步骤操作:

  1. 创建了一些权限设置不当的数据

    $ sudo chown -R www-data:www-data /full/path/to/media

  2. 以网页服务器用户的身份运行 manage.py

    $ sudo -u www-data ./manage.py <你的管理命令>

注意:如果 sudo 没有设置好,你需要先进行设置。

2

问题在于你是以管理员身份运行这个脚本的。

你用哪个用户来运行程序,那个用户就会拥有这个程序创建的所有文件。

一旦你以管理员身份运行程序,所有输出的文件也会归管理员所有,这样运行django应用的用户就无法访问这些文件了。

你应该以运行你的网站应用的同一个用户(比如说)来运行manage.py脚本,这样创建的文件就能被gunicorn进程读取,进而django也能访问。

撰写回答