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

Django 如何仅使用collectstatic忽略特定应用程序的静态文件?,django,django-staticfiles,Django,Django Staticfiles,为了解决这个问题,如果可能的话,我不想将它们都嵌套在一个目录中,而将应用程序的名称放在应用程序的静态文件夹中,这样做会让人觉得多余。如果这是唯一的方法,那么这就是生活。 我正在使用: STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) 以及: 它在运行c

为了解决这个问题,如果可能的话,我不想将它们都嵌套在一个目录中,而将应用程序的名称放在应用程序的静态文件夹中,这样做会让人觉得多余。如果这是唯一的方法,那么这就是生活。

我正在使用:

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

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

唯一的“问题”是它附带了所有源sass和js文件。在某个时刻,我将把这一切都推到S3上,如果可能的话,我希望避免这种情况

我发现如果你跑步:

python manage.py collectstatic -i sass -i js
它仍然编译我指定的JS和CSS文件,而不编译其余的“源”文件。不幸的是,它也会忽略/admin/中与/admin/js/等匹配的每个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()
。我还不确定这种方法是否有效,我需要更多地跟踪collectstatic管理命令的进展情况,因此,如果有人以前做过这件事或simlilar做过的事情,或者知道为什么它会/不会起作用,我们将感谢任何帮助


谢谢

我通过如下子类化Django Finder成功地解决了这个问题:

python2.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))
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))
Python3.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))
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',
]

我不熟悉
django管道
,但我相信它现在有了
pipeline.finders.FileSystemFinder
pipeline.finders.AppDirectoriesFinder
来实现这一点

请参阅上的“如果要从收集的静态文件中排除可管道化内容”一节

另外,从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
时,这会导致压缩/缩小的内容为空,请参阅。我想这将在django管道的未来版本中得到修复。

哇,谢谢你回答这个问题,已经很久了。从那以后,我从Django搬来,虽然我从来没有抽出时间来解决这个问题。看起来你拿到了,虽然我没办法测试。我相信你的话,如果有人来告诉我们其他的,那么我们可以改变事情。
collectstatic--noinput-I模式
对我有用,谢谢