我真的很喜欢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。
答案 0 :(得分:0)
Django设置仅在设置文件外部进行写保护。只要您不创建循环导入,就可以根据已安装应用中的PIPELINE_JS
模块动态设置PIPELINE_CSS
和compressed
。显然,顺序很重要,在加载js和css文件之前,INSTALLED_APPS
需要完整(或者至少包括所有具有compressed
模块的应用程序)。
另一种方法是使用描述符对象(使用__get__
和__set__
方法)作为PIPELINE_JS
和PIPELINE_CSS
设置,懒惰地加载基于应用程序的设置。这将确保所有INSTALLED_APPS
都可用。