Django: ¿Cómo obtener el filepath de un archivo estático en un entorno de desarrollo?

StackOverflow https://stackoverflow.com/questions/9391167

  •  29-10-2019
  •  | 
  •  

Pregunta

Algunos antecedentes primero. Estoy empleando el siguiente "truco" para evitar el almacenamiento en caché del navegador no deseado de archivos estáticos (CSS, JS, etc.):

<script src="{{ STATIC_URL }}js/utils.js?version=1302983029"></script>

Cuando la cadena de la versión cambia en una carga de página posterior, hace que el navegador vuelva a buscar el archivo estático del servidor. (Google "CSS en caché" para artículos sobre este truco).

Quiero que el navegador obtenga la última versión de un archivo estático, pero también quiero permitir que el almacenamiento en caché del navegador cuando el archivo no haya cambiado. En otras palabras, quiero que la cadena de versión cambie si y solo si el archivo estático se ha actualizado. También me gustaría generar la cadena de versión automáticamente.

Para hacer esto, estoy usando la última hora modificada del archivo estático como cadena de versión. Estoy haciendo una etiqueta de plantilla personalizada para hacer esto:

<script src="{% versioned_static 'js/utils.js' %}"></script>

Y así es como funciona la etiqueta de plantilla:

import os.path
from django import template
from django.conf import settings

class VersionedStaticNode(template.Node):
    ...
    def render(self, context):
        # With the example above, self.path_string is "js/utils.js"
        static_file_path = os.path.join(settings.STATIC_ROOT, self.path_string)
        return '%s?version=%s' % (
            os.path.join(settings.STATIC_URL, self.path_string),
            int(os.path.getmtime(static_file_path))
            )

Para obtener el último tiempo modificado del archivo estático, necesito saber su filepath en el sistema. Entiendo este filepath uniéndome settings.STATIC_ROOT y la ruta relativa del archivo de esa raíz estática. Todo esto está bien y bueno para el servidor de producción, ya que todos los archivos estáticos se recopilan en STATIC_ROOT.

Sin embargo, en un servidor de desarrollo (donde se está utilizando el comando managem.py runServer), los archivos estáticos no se recopilan en STATIC_ROOT. Entonces, ¿cómo obtengo el filepático de un archivo estático cuando se ejecuta en desarrollo?

(Para aclarar mi propósito: la situación de almacenamiento en caché que quiero evitar es el navegador que usa un desajuste de nuevo HTML y CSS/JS. nosotros para actualizar las páginas/borrar el caché del navegador con frecuencia).

¿Fue útil?

Solución

Si se usa django.contrib.staticfiles, aquí hay un extracto del Findstatic comando (django/contribus/staticfiles/ganagement/commands/findstatic.py) que debería ayudar. Usa el buscadores. Para localizar el archivo.

    from django.contrib.staticfiles import finders

    result = finders.find(path, all=options['all'])

    path = smart_unicode(path)
    if result:
        if not isinstance(result, (list, tuple)):
            result = [result]
        output = u'\n  '.join(
            (smart_unicode(os.path.realpath(path)) for path in result))
        self.stdout.write(
            smart_str(u"Found '%s' here:\n  %s\n" % (path, output)))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top