Q C*_*ron 10 python django django-staticfiles django-pipeline
我正在尝试使用django-pipeline来缩小静态资源,为它们使用缓存并使我的模板更简单.我的浏览器找到并加载了我的CSS和JS文件,但我的(非常简单的)主页加载大约需要10秒钟.

我使用的是Python 2.7.6,Django 1.7.3和django-pipeline 1.4.3.PyCharm使用本地virtualenv运行开发服务器.
我的settings.py包含以下内容:
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',
},
}
Run Code Online (Sandbox Code Playgroud)
我的基本HTML模板包含以下内容:
{% load staticfiles %}
{% load pipeline %}
<!DOCTYPE html>
<html>
<head>
[...]
{% block css %}
{% stylesheet 'base' %}
{% endblock css %}
{% block javascript %}
{% javascript 'base' %}
{% endblock javascript %}
</head>
<body> [...] </body>
</html>
Run Code Online (Sandbox Code Playgroud)
我的home.html扩展了base.html但不使用css或javascript管道的模板标签.
只是为了确保yuglify可用:
$ yuglify --version
0.1.4
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
注意:如果浏览器找不到静态资产(myapp.css和myapp.js)PIPELINE_ENABLED = True.
问题是模板标签代码正在做很多事情,包括当 debug 为 True 时为每个请求运行collectstatic,这使得开发速度非常慢。即使 debug 为 False,templatetag 仍会连接到 S3 并查询一些内容。当文件位于本地时,这不是一个(大)问题,但当使用 S3 时,这就是一个(大)问题。我能想到的唯一解决方案是编写我自己的简化模板标签,称为pipelines.py.
在开始之前,您需要了解两件重要的事情,首先要让管道正常工作,我有一个空壳 S3PipelineStorage,它结合了管道和 boto,如果您有 s3 + 管道工作,您可能已经有了这个,但它很重要:
from pipeline.storage import PipelineMixin
from storages.backends.s3boto import S3BotoStorage
class S3PipelineStorage(PipelineMixin, S3BotoStorage):
pass
Run Code Online (Sandbox Code Playgroud)
然后在设置中:
STATICFILES_STORAGE = 'path.to.your.file.S3PipelineStorage'
Run Code Online (Sandbox Code Playgroud)
现在,如果您向下看 templatetag,您会发现我使用的staticfiles_storage.url与原始 templatetag 类似。这会将 s3 路径添加到相对路径中,但如果不添加此设置,您将每次查询 S3 来生成 URL。您可以添加该设置或仅硬编码您的 s3 路径,但staticfiles_storage.url我建议您添加该设置,因为它将提高为 s3 资源生成 URL 的任何位置的性能。
AWS_S3_CUSTOM_DOMAIN = 'your_bucket-%s.s3.amazonaws.com' % ENVIRONMENT.lower()
Run Code Online (Sandbox Code Playgroud)
现在您已准备好使用模板标签。简单地使用它{% load pipelines %}来代替{% 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1554 次 |
| 最近记录: |