为什么collectstatic会在安装了django压缩器的情况下擦除我的文件?



我最近在我的Django应用程序(1.4.1)上安装了Django Compressor(1.2)。在我安装django-compressor之前,当我运行collectstatic时,它会通过boto完美地将我的静态文件上传到S3,而不会将它们复制到本地的其他地方。然而,当我安装django压缩器时,运行collectstatic:

A)将我的静态文件上传到S3,但用空文件替换所有本地版本。

B)将我的静态文件上传到S3,但将本地版本复制到我的根文件夹。 对于结果A,我有
COMPRESS_ROOT = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'proj/static',)
对于结果B,我有
STATIC_ROOT = ''
COMPRESS_ROOT = STATIC_ROOT

我理解为什么B将文件复制到根目录,因为这就是STATIC_ROOT设置的,但是如果我注释掉COMPRESS_ROOT, collectstatic就会恢复正常(也就是不修改任何本地内容,只是上传到S3)。我本以为COMPRESS_ROOT不会对collectstatic产生任何影响,因为STATIC_ROOT无论如何都保持不变。显然不是这样的。

作为一种变通方法,我一直在做以下事情:

  • 当我想运行python manage.py compress时,我将COMPRESS_ROOT设置如下:

    COMPRESS_ROOT = os.path.join (os.path.abspath (os.path.dirname (文件)),项目/静态,)

  • 当我想运行python manage.py collectstatic时,我注释掉COMPRESS_ROOT,它将collectstatic返回到django-compressor之前的功能。

显然这是一个hack,我想弄清楚如何让他们玩得好。如有任何建议,不胜感激。

相关代码如下:# settings.py

STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(os.path.abspath(os.path.dirname(__file__)),'proj/static',),
)
AWS_STORAGE_BUCKET_NAME = #bucket-name
S3_URL = 'https://%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATIC_DIRECTORY = '/static/'
STATIC_URL = S3_URL + STATIC_DIRECTORY
COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True
COMPRESS_URL = STATIC_URL
#COMPRESS_ROOT = STATIC_ROOT
#COMPRESS_ROOT = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'proj/static',)
COMPRESS_STORAGE = 'travel.proj.services.storage.CachedS3BotoStorage'
STATICFILES_STORAGE = 'travel.proj.services.storage.CachedS3BotoStorage'
AWS_LOCATION = 'static'
COMPRESS_JS_FILTERS = [
    'compressor.filters.template.TemplateFilter',
]

我认为这可能与django压缩器有关,而不是您的存储设置。

Django-compressor需要一种方法来跟踪文件和更改,我认为它不能在远程存储上做到这一点。因此,为了在django-compressor中使用远程存储,包的作者建议创建默认的S3BotoStorage类的子类,如下所示。

最新更新