/ / Jak wywołać kompresor django z szablonami jinja2 - django, jinja2, minify, django-pipeline, google-app-engine-python

Jak wywołać kompresor django z szablonami jinja2 - django, jinja2, minify, django-pipeline, google-app-engine-python

Chciałbym skompresować JS i CSS w moim projekcie Python opartym na Jinja2 dla silnika aplikacji Google. Zainstalowałem django-pipeline i dodałem go do mojej ścieżki projektu.

Niektórych dokumentacja nie jest dla mnie jasne. Szczególnie użycie Jinja2.

W przypadku szablonów Django w pliku base.html przykład, wstaw:

{% load compressed %}
{% compressed_css "colors" %}
{% compressed_js "stats" %}

Zakładam, że odpowiednik dla Jina2 będzie czymś w rodzaju

{{ compressed_css("main") }}
{{ compressed_js("main") }}

Ale to daje UndefinedError: "compressed_css" jest niezdefiniowane

Moje pytanie brzmi jak załadować "skompresowany" szablon w Jinja2? Nie robi się tego w taki sam sposób, jak Django, a ja nie mogę znaleźć przykładu.

Dokumenty też mówią

Aby użyć rozszerzenia Jinja2 Django Compressor, musielibyśmy pass compressor.contrib.jinja2ext.CompressorExtension into środowisko:

Zrobiłem to.

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

Dokumenty również stwierdzają

"W przeciwieństwie do implementacji tagu szablonu Django, Jinja2 implementacja używa różnych szablonów, więc jeśli chcesz przesłonić należy je zastąpić pipeline / css.jinja i pipeline / js.jinja. "

Nie jestem pewien, czy muszę coś tutaj zrobić.

Moje setings.py zawiera następujące stwierdzenia:

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:bunjilsrctoolsminifyminify.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"
}
}

Odpowiedzi:

0 dla odpowiedzi № 1

Zamierzam opisać rzeczy, które pracowały dla mnie na lokalnym środowisku (nie GAE).

Jeśli podążasz Oficjalny przewodnik django-pipeline stwierdza, że ​​powinieneś dodać pipeline.templatetags.ext.PipelineExtension do twojego środowiska, co dla mnie oznaczało aktualizowanie mojego settings.py do tego:

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

Jak przeprowadzić migrację szablonu? Dla mnie to było łatwe, po prostu usunąłem {% load pipeline %} od góry szablonu i działało.