Skip to content

Commit 840bf27

Browse files
snoepkastcyberdelia
authored andcommitted
Prevent collecting all static multiple times per request
1 parent 9717de7 commit 840bf27

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

pipeline/collector.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212

1313
class Collector(object):
14+
request = None
15+
1416
def __init__(self, storage=None):
1517
if storage is None:
1618
storage = staticfiles_storage
@@ -24,7 +26,10 @@ def clear(self, path=""):
2426
for d in dirs:
2527
self.clear(os.path.join(path, d))
2628

27-
def collect(self):
29+
def collect(self, request=None):
30+
if self.request and self.request is request:
31+
return
32+
self.request = request
2833
found_files = OrderedDict()
2934
for finder in finders.get_finders():
3035
# Ignore our finder to avoid looping

pipeline/templatetags/pipeline.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.contrib.staticfiles.storage import staticfiles_storage
44

55
from django import template
6+
from django.template.base import VariableDoesNotExist
67
from django.template.loader import render_to_string
78
from django.utils.safestring import mark_safe
89

@@ -16,6 +17,15 @@
1617

1718

1819
class PipelineMixin(object):
20+
request = None
21+
_request_var = None
22+
23+
@property
24+
def request_var(self):
25+
if not self._request_var:
26+
self._request_var = template.Variable('request')
27+
return self._request_var
28+
1929
def package_for(self, package_name, package_type):
2030
package = {
2131
'js': getattr(settings, 'PIPELINE_JS', {}).get(package_name, {}),
@@ -32,12 +42,18 @@ def package_for(self, package_name, package_type):
3242

3343
return packager.package_for(package_type, package_name)
3444

45+
def render(self, context):
46+
try:
47+
self.request = self.request_var.resolve(context)
48+
except VariableDoesNotExist:
49+
pass
50+
3551
def render_compressed(self, package, package_type):
3652
if settings.PIPELINE_ENABLED:
3753
method = getattr(self, "render_{0}".format(package_type))
3854
return method(package, package.output_filename)
3955
else:
40-
default_collector.collect()
56+
default_collector.collect(self.request)
4157

4258
packager = Packager()
4359
method = getattr(self, "render_individual_{0}".format(package_type))
@@ -51,7 +67,9 @@ def __init__(self, name):
5167
self.name = name
5268

5369
def render(self, context):
70+
super(StylesheetNode, self).render(context)
5471
package_name = template.Variable(self.name).resolve(context)
72+
5573
try:
5674
package = self.package_for(package_name, 'css')
5775
except PackageNotFound:
@@ -77,7 +95,9 @@ def __init__(self, name):
7795
self.name = name
7896

7997
def render(self, context):
98+
super(JavascriptNode, self).render(context)
8099
package_name = template.Variable(self.name).resolve(context)
100+
81101
try:
82102
package = self.package_for(package_name, 'js')
83103
except PackageNotFound:

0 commit comments

Comments
 (0)