如何在 jinja2 模板中调用 django-pipeline 压缩器

3
我希望能够压缩我的Jinja2基于Python的Google App Engine项目中的JS和CSS。 我已经安装了django-pipeline,并将其添加到我的项目路径中。
其中一些文档对我来说不是很清楚,特别是Jinja2的用法。
对于Django模板,在base.html 示例中插入:
{% load compressed %}
{% compressed_css 'colors' %}
{% compressed_js 'stats' %}

我认为Jina2的等效物可能类似于:
{{ compressed_css("main") }}
{{ compressed_js("main") }}

但是这会导致UndefinedError: 'compressed_css'未定义

我的问题是如何在Jinja2中加载“压缩”模板?这不像Django那样完成,我找不到一个例子。

文档也说:

为了使用Django Compressor的Jinja2扩展,我们需要将compressor.contrib.jinja2ext.CompressorExtension传递给环境:

我已经做到了。

import jinja2
from compressor.contrib.jinja2ext import CompressorExtension
env = jinja2.Environment(extensions=[CompressorExtension])

文档还说明:

“与Django模板标记实现不同,Jinja2实现使用不同的模板,因此,如果您希望覆盖它们,请覆盖pipeline/css.jinja和pipeline/js.jinja。”

我不确定我是否需要在这里做任何事情。

我的setings.py包括以下语句:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',

    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = '{{ project_name }}.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = '{{ project_name }}.wsgi.application'

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, "templates"),
    os.path.join(PROJECT_PATH, "templates/includes")
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework_swagger',
    'django_jinja.contrib._pipeline',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)


SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'pipeline.finders.PipelineFinder'
)
PIPELINE_ENABLE = True
PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.closure.ClosureCompressor'
PIPELINE_CLOSURE_BINARY = 'C:\bunjilsrc\tools\minify\minify.bat'
PIPELINE_DISABLE_WRAPPER = True
PIPELINE_ENABLE_GAE_SUPPORT = True

STATIC_ROOT = 'static/'  
STATIC_URL = '/static/'  
MEDIA_ROOT = 'uploads/'  
MEDIA_URL = "/media/"  

PIPELINE_JS = {
    'main': {
        'source_filenames': (
            'js/site.js '
        ),
        'output_filename': 'js/main.js'
    },
    'vendor': {
        'source_filenames': (
            'js/vendor/jquery.js',
        ),
        'output_filename': 'js/vendor.js'
    }
}

PIPELINE_CSS = {
    'main': {
        'source_filenames': (
            'bootstrap.css',
            'site.css'
                ),
        'output_filename': 'css/main.css'
    }
}

正确的语法似乎是 {%{javascript 'main' %} {%{stylesheet 'main' %},但它没有在settings.py中加载PIPELINE_JS字典。 Pipeline 1.5支持Django 1.8,但不支持Django 1.6。然而,google-app-engine仅支持Django 1.5.8。因此可能存在兼容性问题。没有使用jinja2模板、django-pipeline和app engine的公共示例。尝试其他方法? - intotecho
1个回答

0

我将要描述在本地环境下对我有用的内容(不适用于GAE)。

如果你遵循django-pipeline官方指南,它会指出,你需要将pipeline.templatetags.ext.PipelineExtension加入到你的环境中。对我而言,这意味着我需要更新我的settings.py如下:

# myproject/settings.py
TEMPLATES = [
    {
    ...
    },
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'myproject.jinja2.environment',
            'extensions': ['pipeline.templatetags.ext.PipelineExtension']
        }
    }
]

如何迁移您的模板?对我来说非常简单,我只需从模板顶部删除{% load pipeline %},然后它就可以工作了。


对于想要使用 Pipeline 1.7 而不是 1.5 的人,文档显示 'extension' 应该读作 'pipeline.jinja2.PipelineExtension' 而不是 'pipeline.templatetags.ext.PipelineExtension' - Walfits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接