Domanda

Qualche background prima. Sto impiegando il seguente "trucco" per prevenire la memorizzazione nella cache del browser indesiderata di file statici (CSS, JS, ecc.):

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

Quando la stringa della versione cambia su un successivo caricamento della pagina, rende il browser recuperare il file statico dal server. (Google "Caching CSS" per articoli su questo trucco.)

Voglio che il browser ottenga l'ultima versione di un file statico, ma voglio anche consentire la memorizzazione nella cache del browser quando il file non è cambiato. In altre parole, voglio che la stringa della versione cambi se e solo se il file statico è stato aggiornato. Vorrei anche generare automaticamente la stringa di versione.

Per fare ciò, sto usando l'ultimo tempo modificato del file statico come stringa di versione. Sto realizzando un tag modello personalizzato per farlo:

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

Ed ecco come funziona il tag modello:

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))
            )

Per ottenere l'ultimo tempo modificato del file statico, ho bisogno di conoscere il suo filepath sul sistema. Ottengo questo filepath unendosi settings.STATIC_ROOT e il percorso relativo del file da quella radice statica. Questo va bene per il server di produzione, poiché tutti i file statici vengono raccolti a STATIC_ROOT.

Tuttavia, su un server di sviluppo (in cui viene utilizzato il comando manage.py runserver), i file statici non vengono raccolti su STATIC_ROOT. Quindi, come posso ottenere il filepath di un file statico quando si esegue in sviluppo?

(Per chiarire il mio scopo: la situazione di memorizzazione nella cache che voglio evitare è il browser che utilizza una mancata corrispondenza di nuovi HTML e vecchi CS/JS. In produzione, questo può confondere molto gli utenti; nello sviluppo, questo può confondere me e altri sviluppatori e forze Per aggiornare le pagine/cancellare frequentemente la cache del browser.)

È stato utile?

Soluzione

Se si utilizza django.contrib.staticfiles, ecco un estratto del Findstatic Comando (django/contrib/staticfiles/management/comandi/findstatic.py) che dovrebbe aiutare. Usa il Finders.Find Per individuare il file.

    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)))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top