Estoy involucrado en una aplicación que usa ruido blanco para servir archivos estáticos. Está configurado para usar CompressedManifestStaticFilesStorage que, a su vez, usa ManifestStaticFilesStorage .
Por archivos estáticos, me refiero a los archivos estáticos que proporcionamos y bibliotecas como folletos de terceros.
La clase ManifestStaticFilesStorage , proporcionada por Django, cambiará el nombre de los archivos para incluir un hash. Por cachebusting. Filtra recursos y cambia referencias sin hash a archivos para incluir el hash.
Esto a su vez rompe una función en el folleto:
_detectIconPath: function () { var el = DomUtil.create('div', 'leaflet-default-icon-path', document.body); var path = DomUtil.getStyle(el, 'background-image') || DomUtil.getStyle(el, 'backgroundImage'); // IE8 document.body.removeChild(el); return path.indexOf('url') === 0 ? path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : ''; } El problema es que el valor de la path se parece a:
url("https://example.org/static/path/leaflet/dist/images/marker-icon.2273e3d8ad92.png")Como el nombre del archivo no coincide, el segundo reemplazo no hará nada. Esto a su vez devolverá:
https://example.org/static/path/leaflet/dist/images/marker-icon.2273e3d8ad92.png")Cuando el folleto intenta agregar un nombre de archivo a este "directorio", obtenemos:
https://example.org/static/path/leaflet/dist/images/marker-icon.2273e3d8ad92.png")marker-icon.pngLo cual obviamente está mal.
¿Entonces, cuál es la solución? Me han informado que no deberíamos tratar de codificar nombres de archivo de paquetes de terceros, podría haber otras fallas. Sin embargo, no veo ninguna opción para que ManifestStaticFilesStorage excluya ciertos directorios del hash.
Creé la siguiente clase para tratar de solucionar esto. Hago referencia a esta clase en la configuración en lugar de CompressedManifestStaticFilesStorage .
class MyStorage(CompressedManifestStaticFilesStorage): """ This class overrides the built in class and turns off file name hashing for selected directories. """ def _nonhashed_name_func(self, name, hashed_files=None): name = posixpath.normpath(name) cleaned_name = self.clean_name(name) return cleaned_name def _url(self, hashed_name_func, name, force=False, hashed_files=None): split = name.split("/") if split[0] in ['bower_components', 'node_modules']: hashed_name_func = self._nonhashed_name_func return super()._url(hashed_name_func=hashed_name_func, name=name, force=force, hashed_files=hashed_files)Esto funciona, sin embargo, parece una solución algo poco elegante. ¿Alguien aquí tiene mejores sugerencias?
Encontré esta página que describe problemas similares, en el contexto de Angular2:
https://www.npmjs.com/package/@asymmetrik/angular2-leaflet#a-note-about-markers
En el caso específico del folleto, la solución parece ser anular la ruta del ícono predeterminado. Como estoy usando vue2-leaflet, esto se puede hacer usando:
<v-icondefault :image-path="path"></v-icondefault>Según el ejemplo proporcionado con el código fuente.
El proyecto Leaflet respalda la compatibilidad con leaflet-defaulticon como una solución oficial para este problema.
Recupere todas las opciones de íconos predeterminados de folletos de CSS, en particular, todas las URL de imágenes de íconos, para mejorar la compatibilidad con paquetes y marcos que modifican las URL en CSS. En particular para webpack (con cargadores de estilo, css, archivos y url), Rails Asset Pipeline y Django pipeline. Debería resolver todos los casos de uso vinculados al problema #4968 . (Fuente)