我有一个脚本可以检查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具有相同权限也无法写入该目录。
为了防止它再次发生,解决方案是在创建新文件夹后将所有权恢复到该目录树。
答案 0 :(得分:2)
问题是您以root身份运行脚本。
您运行程序的用户与拥有该程序创建的任何文件的用户相同。
以root身份运行程序后,root用户也将拥有任何输出,这意味着运行django应用程序的用户将无权访问这些文件。
您应该以运行Web应用程序(manage.py
)的同一用户身份运行nobody
脚本,以便gunicorn
进程可以读取创建的文件 - 并且通过扩展, Django的。
答案 1 :(得分:2)
要解开你的第一个问题:
使用错误的烫发创建了一些数据
$ sudo chown -R www-data:www-data /full/path/to/media
将manage.py作为网络服务器用户
运行 $ sudo -u www-data ./manage.py <your-management-command>
注意:如果未设置sudo,则应进行设置。