HashedFilesMixin.patterns should limit URL matches to their respective filetypes
|Reported by:||Owned by:||aehlke|
|Severity:||Normal||Keywords:||HashedFilesMixin CachedFilesMixin staticfiles|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||yes|
HashedFilesMixin contains a
patterns property which maps file extensions to regex patterns. This works great for the default case that Django ships with
"*.css" as the only filetype, but results in surprising behavior once extended with multiple filetypes. I would expect the regex patterns to only apply to the filetype they're categorized under, but once I added
patterns (via subclassing), the CSS rules also applied to my JS files.
My use-case of extending this is to add URL rewriting to JS source map references, e.g.
//# sourceMappingURL=foo.js.map which can appear at the end of JS files. I need to be able to rewrite these URLs in the same way that Django's staticfiles can rewrite URLs in CSS, for e.g. adding hashes to filenames.
Once I tried extending
patterns with this:
patterns = HashedFilesMixin.patterns + ( ("*.js", ( (r"""(//# sourceMappingURL=(\s*))""", """//# sourceMappingURL=%s"""), )), )
The surprising and broken behavior was that Django tried to rewrite "URLs" for this JS (from Backbone.js):
this.loadUrl(window.location.hash), which matched the CSS pattern for rewriting
url(foo) because the regex patterns are case-insensitive.
This also applies to the previous
CachedFilesMixin from before 1.7.
Please let me know if a fix for this would be accepted, and I'll put together a test case and patch.
Change History (14)
comment:1 Changed 3 years ago by
|Summary:||HashedFilesMixin → HashedFilesMixin.patterns should limit URL matches to their respective filetypes|