HashedFilesMixin.patterns should limit URL matches to their respective filetypes
|Reported by:||alex.ehlke@…||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 "*.js" to 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 (12)
comment:1 Changed 13 months ago by anonymous
- Needs documentation unset
- Needs tests unset
- Patch needs improvement unset
- Summary changed from HashedFilesMixin to HashedFilesMixin.patterns should limit URL matches to their respective filetypes
comment:2 Changed 13 months ago by aehlke
- Owner changed from nobody to aehlke
- Status changed from new to assigned
comment:8 Changed 13 months ago by aehlke
- Resolution set to fixed
- Status changed from assigned to closed