如何仅使用collectstatic忽略特定应用程序的静态文件?

时间:2012-08-22 23:44:28

标签: django django-staticfiles

只是为了解决这个问题,如果可能的话,我想在没有将它们全部嵌入到应用程序名称中的应用程序静态文件夹的目录中的情况下执行此操作,这感觉多余。如果这是唯一的方式,那就是生活。

我正在使用:

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'

在运行collectstatic时编译JS和SASS。它们都位于APP_ROOT / static /目录中。

唯一的'问题'是它带来了所有源sass和js文件。在某些时候,我将把这一切推到S3,如果可能的话,我想避免这种情况。

我发现如果你跑:

python manage.py collectstatic -i sass -i js

它仍然编译我指定的JS和CSS文件,同时保留其余的“源”文件。不幸的是,它也忽略了/ admin /中的每个js文件,因为它匹配/ admin / js /等。我甚至不知道这可能是这个特定项目的问题,但我可以预见将来其他应用程序在哪里我肯定会想要在应用程序中包含静态js / css。

我希望能够做的是:

python manage.py collectstatic -i app_name/sass -i app_name/js

正如我在顶部提到的,简单的解决方案是将我的静态文件作为app_name /添加到文件夹中,就像django.contrib.admin这样做。但是,在这一点上,您最终得到了PROJECT_ROOT / app_name / static / app_name / [js | sass | img | data] /的目录结构,我认为应该可以避免冗余。

然后,也许这是最好的选择,以确保避免与其他应用程序发生冲突?

我已经考虑过编写自定义存储和查找程序,我认为可以自行编写。我想首先检查这里,看看这是否是其他人已经解决的问题,或者,要实现检查压倒性的响应是否只是添加前缀目录。

如果我要自己动手,我认为我将采取的路径是django.contrib.staticfiles.finders.AppDirectoriesFinder并覆盖list()。我还不肯定这种方法会起作用,我需要更多地跟踪收集管理命令的进展情况,所以如果有人之前已经完成了这个或类似的东西,或者知道它为什么会/不会起作用,那么任何帮助都是赞赏。

谢谢!

2 个答案:

答案 0 :(得分:5)

我设法通过继承这样的Django查找器来解决这个问题:

PYTHON 2.X

from django.contrib.staticfiles import finders
from django.conf import settings


def add_ignores(ignore_patterns):
    ignore = settings.STATICFILES_FINDERS_IGNORE

    if ignore:
        if ignore_patterns:
            ignore_patterns.extend(ignore)
        else:
            ignore_patterns = ignore

    return ignore_patterns


class FileSystemFinderIgnore(finders.FileSystemFinder):
    def list(self, ignore_patterns):
        return super(FileSystemFinderIgnore, self).list(add_ignores(ignore_patterns))


class AppDirectoriesFinderIgnore(finders.AppDirectoriesFinder):
    def list(self, ignore_patterns):
        return super(AppDirectoriesFinderIgnore, self).list(add_ignores(ignore_patterns))


class DefaultStorageFinderIgnore(finders.DefaultStorageFinder):
    def list(self, ignore_patterns):
        return super(DefaultStorageFinderIgnore, self).list(add_ignores(ignore_patterns))

PYTHON 3.X

from django.contrib.staticfiles import finders
from django.conf import settings


def add_ignores(ignore_patterns):
    ignore = settings.STATICFILES_FINDERS_IGNORE

    if ignore:
        if ignore_patterns:
            ignore_patterns.extend(ignore)
        else:
            ignore_patterns = ignore

    return ignore_patterns


class FileSystemFinderIgnore(finders.FileSystemFinder):
    def list(self, ignore_patterns):
        return super().list(add_ignores(ignore_patterns))


class AppDirectoriesFinderIgnore(finders.AppDirectoriesFinder):
    def list(self, ignore_patterns):
        return super().list(add_ignores(ignore_patterns))


class DefaultStorageFinderIgnore(finders.DefaultStorageFinder):
    def list(self, ignore_patterns):
        return super().list(add_ignores(ignore_patterns))

并将其添加到我的设置中:

STATICFILES_FINDERS_IGNORE = [
    '*.scss',
    '*.js',
]

答案 1 :(得分:0)

我是django-pipeline的新手,但我相信它现在有pipeline.finders.FileSystemFinderpipeline.finders.AppDirectoriesFinder才能做到这一点。

请参阅https://django-pipeline.readthedocs.org/en/latest/storages.html上的“如果要从收集的静态文件中排除Pipelinable内容”部分。

另外,源代码为1.5:

class AppDirectoriesFinder(PatternFilterMixin, DjangoAppDirectoriesFinder):
    """
    Like AppDirectoriesFinder, but doesn't return any additional ignored
    patterns.

    This allows us to concentrate/compress our components without dragging
    the raw versions in via collectstatic.
    """

请注意,在撰写本文时,这会导致DEBUG==True时出现空的压缩/缩小内容,请参阅https://github.com/cyberdelia/django-pipeline/issues/418。我假设这将在未来版本的django-pipeline中修复。