0

我真的很喜欢 django-pipeline,但我希望在每个应用程序中设置我的资产。它更干净,不会与 settings.py 混淆。所以在“核心”应用程序的 __init__.py 中,我有下面的代码。

# __init__.py file

from django.conf import settings
from django.utils.importlib import import_module


GLOBAL_PP_JS = {}
GLOBAL_PP_CSS = {}

for app in settings.INSTALLED_APPS:

    try:
        mod = import_module('%s.compressed' % app)
    except:
        continue

    try:
        GLOBAL_PP_JS.update(mod.PIPELINE_JS)
    except:
        pass

    try:
        GLOBAL_PP_CSS.update(mod.PIPELINE_CSS)
    except:
        pass

PIPELINE_JS = setattr(settings, 'PIPELINE_JS', GLOBAL_PP_JS)
PIPELINE_CSS = setattr(settings, 'PIPELINE_CSS', GLOBAL_PP_CSS)

它在每个应用程序中搜索compressed.py 模块。

# compressed.py file

PIPELINE_JS = {
    'js_group': {
        'source_filenames': (
            'js/base.js',
        ),
        'output_filename': 'js/group.js',
    }
}

好吧,它不起作用,因为设置具有防止覆盖其变量的安全功能。

有人可以指出一些 Django 模式或任何解决方法来使这段代码工作吗?

我正在使用 Django 1.7 和 Django-Pipeline 1.4.3 。

4

1 回答 1

0

Django 设置仅在设置文件之外受到写保护。只要您不创建循环导入,就可以动态设置PIPELINE_JSPIPELINE_CSS基于compressed已安装应用程序中的模块。显然,顺序很重要,并且需要在加载 js 和 css 文件之前INSTALLED_APPS完成(或至少包括所有具有模块的应用程序)。compressed

另一种方法是使用描述符对象(带有__get____set__方法)作为您的PIPELINE_JSPIPELINE_CSS设置,它会延迟加载基于应用程序的设置。这将确保所有内容INSTALLED_APPS都可用。

于 2015-01-27T19:00:57.333 回答