#26249: ManifestStaticFilesStorage crashes on absolute URLs
-------------------------------------+-------------------------------------
     Reporter:  aaugustin            |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  contrib.staticfiles  |                  Version:  1.9
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by aaugustin:

Old description:

> To reproduce, enable ManifestStaticFilesStorage:
>
> {{{
> STATIC_ROOT= '...'
> STATIC_URL = '/static/'
> STATICFILES_DIRS = ['...']
> STATICFILES_STORAGE =
> 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
> }}}
>
> Create `a.css` in one of `STATICFILES_DIRS` with this content:
>
> {{{
> @font-face{font-family:A;src:url(/static/a.woff) format("woff");}
> }}}
>
> Create a `a.woff` file next to `a.css`.
>
> Then collectstatic crashes with this stack trace:
>
> {{{
> Post-processing 'a.css' failed!
>
> Traceback (most recent call last):
>   File "/Users/myk/.virtualenvs/project/bin/django-admin", line 11, in
> <module>
>     sys.exit(execute_from_command_line())
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/core/management/__init__.py", line 353, in
> execute_from_command_line
>     utility.execute()
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/core/management/__init__.py", line 345, in execute
>     self.fetch_command(subcommand).run_from_argv(self.argv)
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/core/management/base.py", line 348, in run_from_argv
>     self.execute(*args, **cmd_options)
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/core/management/base.py", line 399, in execute
>     output = self.handle(*args, **options)
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/management/commands/collectstatic.py",
> line 176, in handle
>     collected = self.collect()
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/management/commands/collectstatic.py",
> line 128, in collect
>     raise processed
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/storage.py", line 245, in
> post_process
>     content = pattern.sub(converter, content)
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/storage.py", line 184, in converter
>     hashed_url = self.url(unquote(joined_result), force=True)
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/storage.py", line 131, in url
>     hashed_name = self.stored_name(clean_name)
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/storage.py", line 280, in stored_name
>     cache_name = self.clean_name(self.hashed_name(name))
>   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
> packages/django/contrib/staticfiles/storage.py", line 94, in hashed_name
>     (clean_name, self))
> ValueError: The file 'a.css/a.woff' could not be found with
> <django.contrib.staticfiles.storage.ManifestStaticFilesStorage object at
> 0x105a34240>.
> }}}
>
> Using `url(./a.woff)` instead of `url(/static/a.woff)` avoids the issue.
>
> It looks like `HashedFilesMixin.url_converter` doesn't handle that case
> gracefully, so we end up with `a.css/a.woff` instead of just `a.woff`.
> When a URL starts with `STATIC_URL`, perhaps it should strip it?
>
> (I ended up with the `/static/` prefix because I set webpack's
> `output.publicPath` to `/static/`. I don't remember why I need it, but it
> doesn't make the bug less valid.)

New description:

 To reproduce, enable ManifestStaticFilesStorage:

 {{{
 STATIC_ROOT= '...'
 STATIC_URL = '/static/'
 STATICFILES_DIRS = ['...']
 STATICFILES_STORAGE =
 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
 }}}

 Create `a.css` in one of `STATICFILES_DIRS` with this content:

 {{{
 @font-face{font-family:A;src:url(/static/a.woff) format("woff");}
 }}}

 Create a `a.woff` file next to `a.css`.

 Then collectstatic crashes with this stack trace:

 {{{
 Post-processing 'a.css' failed!

 Traceback (most recent call last):
   File "/Users/myk/.virtualenvs/project/bin/django-admin", line 11, in
 <module>
     sys.exit(execute_from_command_line())
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/core/management/__init__.py", line 353, in
 execute_from_command_line
     utility.execute()
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/core/management/__init__.py", line 345, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/core/management/base.py", line 348, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/core/management/base.py", line 399, in execute
     output = self.handle(*args, **options)
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/management/commands/collectstatic.py",
 line 176, in handle
     collected = self.collect()
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/management/commands/collectstatic.py",
 line 128, in collect
     raise processed
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/storage.py", line 245, in post_process
     content = pattern.sub(converter, content)
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/storage.py", line 184, in converter
     hashed_url = self.url(unquote(joined_result), force=True)
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/storage.py", line 131, in url
     hashed_name = self.stored_name(clean_name)
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/storage.py", line 280, in stored_name
     cache_name = self.clean_name(self.hashed_name(name))
   File "/Users/myk/.virtualenvs/project/lib/python3.5/site-
 packages/django/contrib/staticfiles/storage.py", line 94, in hashed_name
     (clean_name, self))
 ValueError: The file 'a.css/a.woff' could not be found with
 <django.contrib.staticfiles.storage.ManifestStaticFilesStorage object at
 0x105a34240>.
 }}}

 Using `url(./a.woff)` instead of `url(/static/a.woff)` avoids the issue.

 It looks like `HashedFilesMixin.url_converter` doesn't handle that case
 gracefully, so we end up with `a.css/a.woff` instead of just `a.woff`.
 When a URL starts with `STATIC_URL`, perhaps it should strip it?

 (I ended up with the `/static/` prefix because I set webpack's
 `output.publicPath` to `/static/`. I don't remember why I need it, but it
 doesn't make the bug less valid.)

 (EDIT: I need to set `output.publicPath` to `/static/` because webpack's
 code splitting doesn't work without this -- chunks get loaded from
 /current/url/chunk.js instead of /static/chuck.js, which obviously doesn't
 work. I don't want to include the hostname in the URL because I want to
 use the same build in staging and production.).

--

--
Ticket URL: <https://code.djangoproject.com/ticket/26249#comment:1>
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/067.b7d6cf44f8ad52d1b10a5dbdd4c14d6a%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to