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

时间:2014-08-31 19:38:46

标签: python django file-permissions

我有一个脚本可以检查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]权限被拒绝: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 个答案:

答案 0 :(得分:2)

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

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

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

您应该以运行Web应用程序(manage.py)的同一用户身份运行nobody脚本,以便gunicorn进程可以读取创建的文件 - 并且通过扩展, Django的。

答案 1 :(得分:2)

要解开你的第一个问题:

  1. 使用错误的烫发创建了一些数据

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

  2. 将manage.py作为网络服务器用户

    运行

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

  3. 注意:如果未设置sudo,则应进行设置。