2015-01-30 9 views
10

Ich versuche Django-Pipeline, um statische Ressourcen zu minimieren, Cache für sie zu verwenden und meine Vorlagen zu vereinfachen. Meine CSS- und JS-Dateien werden von meinem Browser gefunden und geladen, aber es dauert ungefähr 10 Sekunden, bis meine (sehr einfache) Homepage geladen ist.Django-Pipeline - Laden der Seite wirklich langsam

enter image description here

Ich verwende Python 2.7.6, Django 1.7.3 und django-Pipeline 1.4.3. PyCharm führt den Entwicklungsserver mit einem lokalen virtualenv aus.

Mein settings.py enthält folgende Komponenten:

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

INSTALLED_APPS = (
    'django_admin_bootstrapped', # custom admin 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # pip installed apps 
    'pipeline', 
    # project apps 
    'myapp', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'pipeline.middleware.MinifyHTMLMiddleware', 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    'pipeline.finders.FileSystemFinder', 
    'pipeline.finders.CachedFileFinder', 
    'pipeline.finders.PipelineFinder', 
) 

STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage' 

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(BASE_DIR, 'static') 

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'myapp/static'), 
) 

STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage' 
PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor' 
PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor' 

PIPELINE_CSS = { 
    'base': { 
     'source_filenames': (
      'myapp/css/base.css', 
      'myapp/bower_components/bootstrap/dist/css/bootstrap.css', 
      'myapp/bower_components/Hover/css/hover.css', 
      'myapp/bower_components/font-awesome/css/font-awesome.css', 
     ), 
     'output_filename': 'css/myapp.css', 
    }, 
} 

PIPELINE_JS = { 
    'base': { 
     'source_filenames': (
      'myapp/bower_components/jquery/dist/jquery.min.js', 
      'myapp/bower_components/bootstrap/dist/js/bootstrap.min.js', 
     ), 
     'output_filename': 'js/myapp.js', 
    }, 
} 

Meine Basis-HTML-Template enthält folgende Komponenten:

{% load staticfiles %} 
{% load pipeline %} 

<!DOCTYPE html> 
<html> 
    <head> 
     [...] 
     {% block css %} 
      {% stylesheet 'base' %} 
     {% endblock css %} 

     {% block javascript %} 
      {% javascript 'base' %} 
     {% endblock javascript %} 

    </head> 
    <body> [...] </body> 
</html> 

Mein home.html erstreckt base.html aber verwendet nicht die CSS noch Javascript Vorlagentags der Pipeline.

Nur um sicherzugehen yuglify steht zur Verfügung:

$ yuglify --version 
0.1.4 

Was mache ich falsch hier?

Hinweis: Der Browser findet keine statischen Elemente (myapp.css und myapp.js), wenn PIPELINE_ENABLED = True.

+0

Haben Sie Glück, das herauszufinden? Ich habe das gleiche Problem, wenn ich Pipeline lokal mit S3 verwende. Das passiert, wenn ich DEBUG = True verwende (und PIPELINE_ENABLED = False, was der Standard ist). Wenn die Pipeline aktiviert ist, funktioniert sie wie erwartet. –

+2

Von dem, woran ich mich erinnere, wurde die Seite sehr langsam geladen, weil die Dateifinder einen riesigen Pfadbaum hatten.Das Problem war, dass mit Debug = False in der Entwicklung, müssen Sie bestimmte Finder verwenden: https://github.com/cyberdelia/django-pipeline/issues/418. Ich glaube, ich bin an diesem Punkt gelandet, als ich dieses Thema erstellt habe. Da ich Frontend-Pakete mit bower verwalte, werden alle Verzeichnisse (src, dist usw.) und Dateien (.json oder andere nutzlose Dateien) in die statischen Dateien aufgenommen! –

+1

Weitere Informationen finden Sie unter https://github.com/cyberdelia/django-pipeline/issues/482. –

Antwort

1

Das Problem ist der Template-Tag-Code macht eine Menge Zeug einschließlich laufenden collectstatic für jede Anfrage, wenn Debug True ist, was dev schmerzhaft langsam macht. Selbst wenn debug auf False gesetzt ist, verbindet sich der Templatetag immer noch mit S3 und fragt nach verschiedenen Dingen. Wenn die Dateien lokal sind, ist das kein (großes) Problem, aber wenn S3 verwendet wird, ist es. Die einzige Lösung, die ich mir vorstellen konnte, ist das Schreiben meines eigenen vereinfachten Template-Tags namens pipelines.py.

Bevor Sie sich damit befassen, gibt es zwei wichtige Dinge, die Sie wissen müssen, zuerst Pipeline zu arbeiten Ich habe eine leere Shell S3PipelineStorage, die Pipeline und Boto kombiniert, haben Sie wahrscheinlich schon, wenn Sie s3 + Pipeline arbeiten aber es ist wichtig:

from pipeline.storage import PipelineMixin 
from storages.backends.s3boto import S3BotoStorage 

class S3PipelineStorage(PipelineMixin, S3BotoStorage): 
    pass 

dann in Einstellungen:

STATICFILES_STORAGE = 'path.to.your.file.S3PipelineStorage' 

Nun, wenn man sich den TemplateTag nach unten schauen Sie werden sehen, ich staticfiles_storage.url ähnlich wie das Original TemplateTag verwenden. Dadurch wird der Pfad s3 zum relativen Pfad hinzugefügt. Wenn Sie diese Einstellung jedoch nicht hinzufügen, werden Sie jedes Mal S3 abfragen, um die URL zu generieren. Sie können die Einstellung hinzufügen oder nur Ihren s3 Pfad anstelle von staticfiles_storage.url fest codieren, aber ich schlage vor, dass Sie die Einstellung hinzufügen, da es die Leistung überall dort verbessert, wo eine URL für eine s3-Ressource generiert wird.

AWS_S3_CUSTOM_DOMAIN = 'your_bucket-%s.s3.amazonaws.com' % ENVIRONMENT.lower() 

Jetzt sind Sie bereit für den Vorlagentag. Um es einfach zu verwenden {% load pipelines %} anstelle von {% load pipeline %}.

from django.contrib.staticfiles.storage import staticfiles_storage 
from django import template 
from django.template.loader import render_to_string 
from django.utils.safestring import mark_safe 
from pipeline.conf import settings 

register = template.Library() 

@register.simple_tag 
def stylesheet(group): 

    if group not in settings.PIPELINE_CSS: 
     return '' 

    if settings.DEBUG is False or settings.PIPELINE_ENABLED is True: 
     context = { 
      'type': 'text/css', 
      'url': mark_safe(staticfiles_storage.url(settings.PIPELINE_CSS[group]['output_filename'])) 
     } 
     html = render_to_string("pipeline/css.html", context) 
    else: 
     html = '' 
     for path in settings.PIPELINE_CSS[group]['source_filenames']: 
      context = { 
       'type': 'text/css', 
       'url': mark_safe(staticfiles_storage.url(path)) 
      } 
      html = "%s\n  %s" % (html, render_to_string("pipeline/css.html", context)) 

    return html 

@register.simple_tag 
def javascript(group): 

    if group not in settings.PIPELINE_JS: 
     return '' 

    if settings.DEBUG is False or settings.PIPELINE_ENABLED is True: 
     context = { 
      'type': 'text/javascript', 
      'url': mark_safe(staticfiles_storage.url(settings.PIPELINE_JS[group]['output_filename'])) 
     } 
     html = render_to_string("pipeline/js.html", context) 
    else: 
     html = '' 
     for path in settings.PIPELINE_JS[group]['source_filenames']: 
      context = { 
       'type': 'text/javascript', 
       'url': mark_safe(staticfiles_storage.url(path)) 
      } 
      html = "%s\n  %s" % (html, render_to_string("pipeline/js.html", context)) 

    return html 
Verwandte Themen