7

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

我在用:

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()。我还不确定这种方法会起作用,我需要更多地跟踪 collectstatic 管理命令的进展情况,所以如果有人以前做过这个或类似的事情,或者知道它为什么会/不会起作用,任何帮助都是赞赏。

谢谢!

4

2 回答 2

6

我设法通过像这样子类化 Django 查找器来解决这个问题:

蟒蛇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))

蟒蛇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',
]
于 2014-12-08T23:19:54.607 回答
0

我是新手django-pipeline,但我相信它现在已经pipeline.finders.FileSystemFinder并且pipeline.finders.AppDirectoriesFinder可以做到这一点。

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

另外,从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 的未来版本中得到修复。

于 2015-10-15T13:59:00.087 回答