我有一个用Django构建的网站,允许用户上传文件。然后处理此文件并创建一堆其他文件。这些文件归我的帐户所属的用户/组 www-data 所有。其他人编写了创建这些文件的脚本,它使用了我很遗憾不熟悉的程序。这些文件具有rw-r--r-权限,我可以手动删除它们以及通过网站删除它们。
然后,该网站调用"collectstatic"Django命令,将这些文件(由www-data拥有)复制到static_root目录中。这些文件我无法手动删除,也无法让网站调用脚本删除它们。我收到"权限被拒绝"错误。最初这些文件与它们从中复制的文件(rw-r--r--)具有相同的性能,但我设法通过扩展 django StaticFilesStorage 对象来使它们拥有 rw-rw-rw,如下所示:
from django.contrib.staticfiles.storage import StaticFilesStorage
import os
class MyStaticFilesStorage(StaticFilesStorage):
def save(self, name, content):
os.umask(0)
super(MyStaticFilesStorage, self).save(name, content)
今年夏天我才开始使用Django和Python,所以我真的不太熟悉它。任何帮助将不胜感激。我不明白为什么我不能删除对我所属的组具有"写入"权限的文件。
编辑:
我认为问题出在哪里:创建文件的程序为它们创建一个具有 drwxrwxrwx 权限的目录。"collectstatic"将此目录复制到我的static_root目录中,该新目录上的属性是drwxr-xr-x。
要在类似 unix 的环境中删除文件,您需要对目录的写入权限,而不是文件本身。
因此,请尝试chmod 775静态文件所在的目录,它应该可以工作。
顺便说一句:恕我直言,以上述方式修补静态文件存储不是一个好的解决方案,无论如何都不需要。
>collectstatic
使用FILE_UPLOAD_PERMISSIONS
和FILE_UPLOAD_DIRECTORY_PERMISSIONS
(后者是Django 1.7中的新功能)。
请参阅 https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#django-admin-collectstatic。