2014-08-31 59 views
1

我有一个脚本,用于检查json文件并将照片下载到文件夹中。如果django manage.py脚本搞砸了目录权限

该位检查目录是否存在,如果没有,创建它:

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运行与用户没有人,这从来没有造成过问题。

什么可能导致这个问题,我怎么阻止它在将来发生?

编辑:

我尝试了建议,波纹管,但在运行脚本无人只返回了一个错误:

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

我还检查和其他文件夹,通过Django的管理员创建接口,也归

解决方案:

的os.makedirs命令改为由root拥有整个目录树,这就是为什么,即使有相同的权限其他文件夹的Django无法写入该目录。

为防止它再次发生,解决方案是在创建新文件夹后将所有权恢复到该目录树。

+0

这个脚本,它运行的是什么用户? – 2014-08-31 19:40:53

+0

@BurhanKhalid我以root身份登录到了Ubuntu服务器上。 – 2014-08-31 19:50:03

+0

你是否以root身份运行脚本? ('manage.py'脚本)。 – 2014-08-31 19:53:45

回答

2

问题是您以root身份运行脚本。

您运行程序的用户是拥有该程序创建的任何文件的用户。

以root用户身份运行程序后,任何输出都将由root用户拥有,这意味着运行django应用程序的用户将无权访问这些文件。

您应该运行manage.py脚本,使创建的文件,然后由gunicorn过程可读运行您的Web应用程序(nobody)相同的用户 - 推而广之,Django的。

2

退绕你的第一个问题:

  1. 创建了一些数据与糟糕的烫发

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

  2. 运行管理。PY作为Web服务器用户

    $ sudo -u www-data ./manage.py <your-management-command>

注意:如果没有设置sudo,则应该对其进行设置。