#34497: ManifestStaticFilesStorage skips import and export of javascript modules
with absolute paths
-------------------------------------+-------------------------------------
Reporter: Hielke | Owner: nobody
Walinga |
Type: Bug | Status: new
Component: | Version: 4.2
contrib.staticfiles | Keywords:
Severity: Normal | ManifestStaticFilesStorage ES
Triage Stage: | modules
Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
The recently added support for finding the ES modules does not work for
absolute paths. As this is skipped.
It is not uncommon to import from the absolute path.
{{{
import function from "/appname/file.js"
}}}
The current implementation just skips this.
A change in the code can be made to find these correctly.
Current:
{{{
# Ignore absolute/protocol-relative and data-uri URLs.
if re.match(r"^[a-z]+:", url):
return matched
# Ignore absolute URLs that don't point to a static file
(dynamic
# CSS / JS?). Note that STATIC_URL cannot be empty.
if url.startswith("/") and not
url.startswith(settings.STATIC_URL):
return matched
# Strip off the fragment so a path-like fragment won't
interfere.
url_path, fragment = urldefrag(url)
# Ignore URLs without a path
if not url_path:
return matched
if url_path.startswith("/"):
# Otherwise the condition above would have returned
prematurely.
assert url_path.startswith(settings.STATIC_URL)
target_name = url_path[len(settings.STATIC_URL) :]
else:
# We're using the posixpath module to mix paths and URLs
conveniently.
source_name = name if os.sep == "/" else
name.replace(os.sep, "/")
target_name =
posixpath.join(posixpath.dirname(source_name), url_path)
# Determine the hashed name of the target file with the
storage backend.
hashed_url = self._url(
self._stored_name,
unquote(target_name),
force=True,
hashed_files=hashed_files,
)
transformed_url = "/".join(
url_path.split("/")[:-1] + hashed_url.split("/")[-1:]
)
}}}
Proposed change:
{{{
# Ignore absolute/protocol-relative and data-uri URLs.
if re.match(r"^[a-z]+:", url):
return matched
# Strip off the fragment so a path-like fragment won't
interfere.
url_path, fragment = urldefrag(url)
# Ignore URLs without a path
if not url_path:
return matched
if url_path.startswith('/'):
if url_path.startswith(settings.STATIC_URL):
target_name = url_path[len(settings.STATIC_URL):]
else:
target_name = url_path[1:]
else:
# We're using the posixpath module to mix paths and URLs
conveniently.
source_name = name if os.sep == '/' else
name.replace(os.sep, '/')
target_name =
posixpath.join(posixpath.dirname(source_name), url_path)
try:
# Determine the hashed name of the target file with the
storage backend.
hashed_url = self._url(
self._stored_name, unquote(target_name),
force=True, hashed_files=hashed_files,
)
except ValueError:
# Ignore absolute URLs that don't point to a static file
(dynamic
# CSS / JS?). Note that STATIC_URL cannot be empty.
if url.startswith("/") and not
url.startswith(settings.STATIC_URL):
return matched
else:
raise
transformed_url = "/".join(
url_path.split("/")[:-1] + hashed_url.split("/")[-1:]
)
}}}
== PR
I could make a PR if this seems good. Thank you.
--
Ticket URL: <https://code.djangoproject.com/ticket/34497>
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 view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/010701878075bfd7-4aeaabf3-221b-43aa-bae8-16146c9c79cb-000000%40eu-central-1.amazonses.com.