#22353: CachedStaticFilesMixin lags in updating hashed names of other static 
files
referenced in CSS
-------------------------------------+--------------------
     Reporter:  woodlee              |      Owner:  nobody
         Type:  Bug                  |     Status:  new
    Component:  contrib.staticfiles  |    Version:  1.6
     Severity:  Normal               |   Keywords:
 Triage Stage:  Unreviewed           |  Has patch:  0
Easy pickings:  1                    |      UI/UX:  0
-------------------------------------+--------------------
 Procedure to replicate:

 1. Be using staticfiles with CachedStaticFilesStorage.
 2. Have a CSS file such as 'abc.css' which refers to an image file such as
 'xyz.png' (via either "url()" or "@import").
 3. Do an initial run of collectstatic. Observe correct substitution of the
 path to 'xyz.png' to its hashed name within abc.css.
 4. Change the contents of xyz.png (maybe it's a sprites file... so changes
 aren't unheard of!).
 5. Rerun collectstatic (without the --clear option).
 6. Observe that abc.css still refers to the old hashed name of xyz.png;
 this is the bug.
 7. Run collectstatic a third time.
 8. Observe that abc.css now refers to the correct, newer hashed name of
 xyz.png.

 I believe this is happening because during post_process, when the
 url_converter calls url() (see
 
https://github.com/django/django/blob/1.6.2/django/contrib/staticfiles/storage.py#L195),
 url() gets the hashed name out of the staticfiles cache... which has not
 yet been updated with the new hashed-name value for the image file, since
 said cache updating doesn't happen until the end of post_process.

 I think the best solution may be to add a kwarg of 'use_cache=True' to
 url(), which url_converter can set to False when it calls url(). When
 False, the cache will simply be evaded (not updated) and hashed_name can
 be called directly. In this way, url_converter is always substituting to
 the most up-to-date hash, but actually updating the cache is still delayed
 until the end of post_process, which seems desirable since I think
 updating that cache should happen as closely as possible in time to the
 moment when the new static assets are placed wherever they'll be served
 from (bit of a race condition, there).

 Unrelated: it would be nice to warn in documentation that if you define a
 separate 'staticfiles' cache in CACHES, it might be desirable to set its
 TIMEOUT option to None. I kept wondering why lookups were coming back
 empty and eventually realized it was because my staticfiles cache was
 using the default 5 minute timeout.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/22353>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/050.45561e1f63cdf38d47cef8e664bfb0f0%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to