2015-01-30 29 views
10

Próbuję django-pipeline, aby zminimalizować zasoby statyczne, użyć dla nich bufora i uprościć szablony. Moje pliki CSS i JS zostały znalezione i wczytane przez moją przeglądarkę, ale załadowanie mojej (bardzo prostej) strony głównej zajmuje około 10 sekund.django-pipeline - ładowanie strony naprawdę powolne

enter image description here

Używam Python 2.7.6 i 1.7.3, Django Django rurociągu 1.4.3. PyCharm uruchamia serwer programistyczny za pomocą lokalnego virtualenv.

Moja settings.py zawiera następujące elementy:

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', 
    }, 
} 

Moja baza szablon HTML zawiera następujące elementy:

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

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

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

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

Moja home.html rozciąga base.html ale nie używa ani css javascript znaczniki szablonów potoku.

Wystarczy upewnić yuglify jest dostępny:

$ yuglify --version 
0.1.4 

Co robię źle tutaj?

Uwaga: przeglądarka nie znaleźliśmy aktywów statyczne (myapp.css i myapp.js), jeżeli PIPELINE_ENABLED = True.

+0

Czy to szczęście? Mam ten sam problem, gdy używam potoku lokalnie z S3. tj. Zdarza się, gdy używam DEBUG = True (i PIPELINE_ENABLED = False, co jest domyślne). Po włączeniu potoku działa zgodnie z oczekiwaniami. –

+2

Z tego co pamiętam, strona ładowała się bardzo powoli, ponieważ wyszukiwarka plików miała wielkie drzewo ścieżek do przejścia.Problem polegał na tym, że przy debugowaniu = False w rozwoju, musisz użyć konkretnych wyszukiwaczy: https://github.com/cyberdelia/django-pipeline/issues/418. Myślę, że skończyłem w tym momencie, kiedy stworzyłem ten temat. Ponieważ zarządzam pakietami front-end z altanką, wszystkie pliki katalogowe (src, dist itd.) I pliki (.json lub inne niepotrzebne pliki) są dołączane do plików statycznych! –

+1

Więcej informacji można znaleźć na stronie https://github.com/cyberdelia/django-pipeline/issues/482. –

Odpowiedz

1

Problem polega na tym, że kod znacznika szablonu wykonuje wiele czynności, w tym działa koligacja dla każdego żądania, gdy debugowanie jest prawdą, co sprawia, że ​​twórca działa boleśnie wolno. Nawet jeśli debugowanie jest fałszywe, templatetag nadal będzie się łączyć z zapytaniem S3 o kilka rzeczy. Gdy pliki są lokalne, nie jest to (duży) problem, ale w przypadku korzystania z S3 jest. Jedynym rozwiązaniem, jakie mogłem wymyślić, jest napisanie własnego uproszczonego szablonu templatetag o nazwie pipelines.py.

Zanim się do niego dostaniesz, musisz pamiętać o dwóch ważnych rzeczach: po pierwsze, aby potok działał Mam pustą powłokę S3PipelineStorage, która łączy w sobie potok i boto, prawdopodobnie już to masz, jeśli masz s3 + działający potok, ale to jest ważne:

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

class S3PipelineStorage(PipelineMixin, S3BotoStorage): 
    pass 

Następnie w ustawieniach:

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

teraz, jeśli spojrzeć w dół na templatetag widać używam staticfiles_storage.url podobny do oryginalnego templatetag. Dodaje to ścieżkę s3 do ścieżki względnej, ale jeśli nie dodasz tego ustawienia, za każdym razem będziesz wysyłać zapytania do S3, aby wygenerować adres URL. Możesz dodać ustawienie lub po prostu zakodować ścieżkę s3 zamiast staticfiles_storage.url, ale sugeruję dodanie tego ustawienia, ponieważ zwiększy to wydajność wszędzie tam, gdzie generowany jest URL dla zasobu s3.

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

Teraz jesteś gotowy na templatetag. Aby użyć go po prostu {% load pipelines %} zamiast {% 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