- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试 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',
},
}
我的基本 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>
我的 home.html 扩展了 base.html 但不使用 css 或 javascript 管道的模板标签。
只是为了确保 yuglify 可用:
$ yuglify --version
0.1.4
我在这里做错了什么?
注意:如果 PIPELINE_ENABLED = True
,浏览器不会找到静态 Assets (myapp.css 和 myapp.js)。
最佳答案
问题是模板标记代码正在做一堆事情,包括在 debug 为 True 时为每个请求运行 collectstatic,这使得开发速度非常慢。即使 debug 为 False,templatetag 仍将连接到 S3 并查询 S3 以获取一些信息。当文件是本地文件时,这不是一个(大)问题,但在使用 S3 时却是。我能想到的唯一解决方案是编写我自己的名为 pipelines.py
的简化模板标签。
在开始之前,您需要了解两件重要的事情,首先是让管道工作很重要:
from pipeline.storage import PipelineMixin
from storages.backends.s3boto import S3BotoStorage
class S3PipelineStorage(PipelineMixin, S3BotoStorage):
pass
然后在设置中:
STATICFILES_STORAGE = 'path.to.your.file.S3PipelineStorage'
现在,如果您向下看模板标签,您会看到我使用的 staticfiles_storage.url
类似于原始模板标签。这会将 s3 路径添加到相对路径,但如果您不添加此设置,您将每次查询 S3 以生成 URL。您可以添加设置或只是硬编码您的 s3 路径而不是 staticfiles_storage.url
但是我建议您添加该设置,因为它会在为 s3 资源生成 URL 的任何地方提高性能。
AWS_S3_CUSTOM_DOMAIN = 'your_bucket-%s.s3.amazonaws.com' % ENVIRONMENT.lower()
现在您已准备好使用模板标签。要使用它,只需 {% 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
关于python - django-pipeline - 页面加载真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239383/
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!