django manage.py 脚本搞乱了目录权限
我有一个脚本,它会检查一个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 个回答
要解决你的第一个问题,可以按照以下步骤操作:
创建了一些权限设置不当的数据
$ sudo chown -R www-data:www-data /full/path/to/media
以网页服务器用户的身份运行 manage.py
$ sudo -u www-data ./manage.py <你的管理命令>
注意:如果 sudo 没有设置好,你需要先进行设置。
问题在于你是以管理员身份运行这个脚本的。
你用哪个用户来运行程序,那个用户就会拥有这个程序创建的所有文件。
一旦你以管理员身份运行程序,所有输出的文件也会归管理员所有,这样运行django应用的用户就无法访问这些文件了。
你应该以运行你的网站应用的同一个用户(比如说manage.py
脚本,这样创建的文件就能被gunicorn
进程读取,进而django也能访问。