2015-01-30 14 views
10

Sto provando la django-pipeline per ridurre le risorse statiche, utilizzare la cache per loro e semplificare i miei modelli. I miei file CSS e JS vengono trovati e caricati dal mio browser, ma per la mia (molto semplice) home page sono necessari circa 10 secondi.django-pipeline - La pagina si carica molto lentamente

enter image description here

Sto usando Python 2.7.6, 1.7.3 e Django Django-gasdotto 1.4.3. PyCharm esegue il server di sviluppo con un virtualenv locale.

mio settings.py contiene quanto segue:

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

Il mio modello di base HTML contiene il seguente:

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

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

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

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

mio home.html estende base.html ma non usa il CSS né javascript tag modello della pipeline.

solo per assicurarsi che yuglify è disponibile:

$ yuglify --version 
0.1.4 

Che cosa sto facendo male qui?

Nota: il browser non trova risorse statiche (myapp.css e myapp.js) se PIPELINE_ENABLED = True.

+0

Che fortuna comprenderlo? Sto riscontrando lo stesso problema quando utilizzo la pipeline localmente con S3. cioè, accade quando sto usando DEBUG = True (e PIPELINE_ENABLED = False, che è il default). Con la pipeline abilitata, funziona come previsto. –

+2

Da quello che ricordo, la pagina si stava caricando molto lentamente perché i cercatori di file avevano un enorme albero del percorso da percorrere.Il problema era che con debug = False in sviluppo, devi usare specifici finder: https://github.com/cyberdelia/django-pipeline/issues/418. Penso di essere arrivato a questo punto quando ho creato questo argomento. Poiché gestisco pacchetti front-end con bower, tutte le directory (src, dist ecc.) Ei file (.json o altri file inutili) vengono inclusi nei file statici! –

+1

Per ulteriori informazioni, consultare https://github.com/cyberdelia/django-pipeline/issues/482. –

risposta

1

Il problema è che il codice del tag template sta facendo un sacco di cose, inclusa la raccolta collectstatic per ogni richiesta quando il debug è True, il che rende dolorosamente lento dev. Anche se il debug è False, il templatetag continuerà a connettersi ea interrogare S3 per diverse cose. Quando i file sono locali questo non è un problema (grosso) ma quando si usa S3 lo è. L'unica soluzione che potrei inventare è scrivere il mio templatetag semplificato chiamato pipelines.py.

Prima di entrare ci sono due cose importanti che devi sapere, prima di far funzionare la pipeline ho una shell vuota S3PipelineStorage che combina pipeline e boto, probabilmente hai già questo se hai la pipeline s3 + funzionante ma è importante:

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

class S3PipelineStorage(PipelineMixin, S3BotoStorage): 
    pass 

Poi nelle impostazioni:

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

Ora, se si guarda giù alla templatetag vedrete che uso staticfiles_storage.url simile al templatetag originale. Ciò aggiunge il percorso s3 al percorso relativo, ma se non si aggiunge questa impostazione, si invierà query S3 ogni volta per generare l'URL. È possibile aggiungere l'impostazione o semplicemente il codice hard del proprio percorso s3 invece di staticfiles_storage.url tuttavia suggerisco di aggiungere l'impostazione perché migliorerà le prestazioni ovunque venga generato un URL per una risorsa s3.

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

Ora siete pronti per il templatetag. Per utilizzarlo semplicemente {% load pipelines %} anziché {% 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 
Problemi correlati