gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:23:10 27 4
gpt4 key购买 nike

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

我在用:

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/等。我什至不知道这是否可能是这个特定项目的问题,但我可以预见 future 其他应用程序我肯定希望包含保存在应用程序中的静态 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]/,我认为应该可以避免冗余。

话又说回来,也许这是最好的选择,以保证避免与其他应用程序发生冲突?

我已经研究过编写自定义存储和查找器,我认为可以推出我自己的。我想先在这里检查一下,看看这是否是其他人已经解决的问题,或者,如果压倒性的 react 只是添加前缀目录,则进行现实检查。

如果我自己动手,我想我会走的路是扩展 django.contrib.staticfiles.finders.AppDirectoriesFinder和覆盖 list() .我还不确定这种方法是否有效,我需要更多地跟踪 collectstatic 管理命令的进展情况,所以如果有人以前做过这个或类似的事情,或者知道为什么它会/不会起作用,任何帮助都是赞赏。

谢谢!

最佳答案

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

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',
]

关于django - 如何仅使用 collectstatic 忽略特定应用程序的静态文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12082902/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com