web-dev-qa-db-ger.com

Django aktualisiert keine statischen Dateien

Das ist nervig. Ich habe eine Javascript-Datei, die auf einer Django-Vorlage referenziert ist:

 <script src="{% static 'js/login.js' %} "></script>

Ich habe einige Änderungen an der js-Datei vorgenommen. Dann aktualisiere ich die Seite und kann die Änderungen nicht sehen.

Wenn ich das Javascript aus der Datei entferne und es in den HTML-Code stecke, funktioniert es korrekt, aber wenn ich versuche, es mit der externen js-Datei zu tun, dann funktioniert es nicht. Ich habe versucht, den Server zu schließen und den Runserver mehrmals auszuführen. Außerdem habe ich versucht, von Firefox zu Chrome zu wechseln. Es macht überhaupt keinen Sinn. Bitte helfen Sie mir zu verstehen, dass ich alle Js in das HTML aufnehmen kann, aber es stört mich, dass ich es nicht mehr normal machen kann.

Weitere Details zu diesem Fehler (das seltsamste, was ich gefunden habe):

Das Javascript ist ungefähr so:

old_sentence = "Dig that hole, forget the Sun"  // this is what I want to change
$("#jqselector").text(old_sentence)

new_sentence = "Run, rabbit, run"  // this is the new sentence, it just won't show up.

Also habe ich die Js geändert und den Server neu gestartet. Die HTML-Datei zeigt immer noch den alten Satz. Dann löschte ich den Verweis auf die login.js-Datei und fügte alle js in Skript-Tags in den HTML-Code ein. Der neue Satz erscheint natürlich. Dann füge ich die login.js-Datei ein, kommentiere die js in der HTML-Datei aus, ABER ich lösche den gesamten Inhalt der login.js-Datei und mache daraus eine leere Datei ... aber der alte Satz erscheint immer noch. Daher muss die alte login.js-Datei an einem Ort eingelöst werden, den ich nicht kenne. Dann öffne ich Chrome und versuche es noch einmal, dasselbe Problem. 

Was kann es sein? Gibt es eine Möglichkeit, Django zu zwingen, statische Dateien zu aktualisieren? Ich dachte, ein Neustart des Servers war genug. .. sollte ich meinen Computer neu starten? :/lol.

31
  • Statische Datei python manage.py collectstatic --noinput --clear löschen. Dadurch wird die Statik zuvor gelöscht.

  • Löschen Sie den Browser-Cache

  • Fügen Sie eine zufällige Zeichenfolge nach dem js-Datei-Include hinzu, z.

Hat es geholfen?

32
Danial Tz

Es klingt, als hätten beide Browser die Javascript-Datei zwischengespeichert. In Chrome können Sie den Cache löschen, indem Sie Ctrl + Shift + Del drücken und nur "Zwischengespeicherte Bilder und Dateien" anhaken. Firefox hat wahrscheinlich eine ähnliche Verknüpfung. 

Sie können einen Blick auf diese Frage auf Tipps zum Deaktivieren der Zwischenspeicherung statischer Dateien auf Ihrem Entwicklungsserver werfen. 

19
knbk

Sie müssen den Browser-Cache aufheben. Dieses Vorlagen-Tag gibt eine zeitbasierte uuid aus, wenn DEBUG=True. Andernfalls wird nach einer Umgebungsvariable PROJECT_VERSION gesucht. Wird dies nicht gefunden, wird eine statische Versionsnummer ausgegeben.

import os
import uuid
from Django import template                                                                                                              
from Django.conf import settings                                                                                                         

register = template.Library()                                                                                                            

@register.simple_tag(name='cache_bust')                                                                                                  
def cache_bust():                                                                                                                        

    if settings.DEBUG:                                                                                                                   
        version = uuid.uuid1()                                                                                                           
    else:                                                                                                                                
        version = os.environ.get('PROJECT_VERSION')                                                                                       
        if version is None:                                                                                                              
            version = '1'                                                                                                                

    return '__v__={version}'.format(version=version)

Sie würden in einer Vorlage wie folgt verwenden:

{% load cache_bust %}

<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>

und hier ist die resultierende Ausgabe:

<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>
13
Derrick Petzold

Ich habe auch stundenlang mit diesem Problem zu kämpfen. Ich habe versucht, eine zufällige Zeichenfolge mithilfe von Javascript zu injizieren, aber diese Methode erscheint dumm und hässlich. Eine Möglichkeit, mit diesem Problem umzugehen, ist die Einführung eines benutzerdefinierten Tags. In diesem Dokument finden Sie Details:

Insbesondere müssen Sie ein Paket mit dem Namen templatetags in den von Ihnen erstellten Apps erstellen (oder ein neues erstellen, wenn Sie möchten). Und Sie erstellen eine beliebige Datei in diesem Paket und schreiben etwas wie folgt:

from Django import template
from Django.utils.crypto import get_random_string
from Django.templatetags import static

register = template.Library()


class StaticExtraNode(static.StaticNode):

    def render(self, context):
        return super().render(context) + '?v=' + get_random_string(32)


@register.tag('static_no_cache')
def do_static_extra(parser, token):
    return StaticExtraNode.handle_token(parser, token)


def static_extra(path):
    return StaticExtraNode.handle_simple(path)

dann können Sie mit dem Tag {% static_no_cache '.../.../path...' %} einen Pfad mit zufälligen Argumenten erstellen!

Ich hoffe das würde helfen!

2
Scott Chang

Für mich nach dem erneuten Sammeln der statischen Dateien werden nur Änderungen für mich wiedergegeben.

$ python manage.py collectstatic --noinput --clear

Nun starte deinen Server, hoffe es funktioniert.

$ python manage.py runserver
0
Chandan Sharma

Eine Lösung besteht darin, die Einstellungen wie folgt zu ändern:

STATICFILES_STORAGE = 'Django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

Dazu wird eine Kopie der statischen Datei mit einem Inhalts-Hash im Dateinamen erstellt (wenn collectstatic ausgeführt wird). Auf diese Weise wird der Dateiname geändert, wenn der Inhalt geändert wird, und der alte Cache wird nicht verwendet. Das einzige Problem dabei ist, dass es im DEBUG = True-Modus nicht gewöhnt ist.

Sie können die docs auf ManifestStaticFilesStorage lesen, um weitere Informationen zu erhalten.

EDIT: Ich habe eine -Lösung gefunden, um sicherzustellen, dass statische Dateien nicht in dev zwischengespeichert werden.

0
Tim Tisdall

Wenn Sie den Browser-Cache nicht jedes Mal aktualisieren möchten, wenn Sie Ihre CSS- und JavaScript-Dateien ändern oder Bilder stylen, müssen Sie STATIC_URLdynamisch mit einer variablen Pfadkomponente festlegen. Bei der sich dynamisch ändernden URL erzwingt der Browser des Besuchers, wenn der Code aktualisiert wird, das Laden von vollständig neuen, nicht zwischengespeicherten statischen Dateien. In diesem Rezept legen wir einen dynamischen Pfad für STATIC_URL fest, wobei der Zeitpunkt der letzten Bearbeitung in os verwendet wird.

import os
from datetime import datetime    

def get_file_changeset(absolute_path):
    timestamp = max(map(lambda x: os.path.getmtime(x[0]), os.walk(os.path.join(absolute_path, 'static'))))
    try:
        timestamp = datetime.utcfromtimestamp(int(timestamp))
    except ValueError:
        return ""
    changeset = timestamp.strftime('%Y%m%d%H%M%S')
    return changeset

Und nächste Änderung in Ihrer SETTINGS

from utils.misc import get_file_changeset
STATIC_URL = "/static/%s/" % get_file_changeset(BASE_DIR)

Wie es funktioniert:
. Die Funktion get_file_changeset()function nimmt das Verzeichnis absolute_path als Parameter und ruft die os.path.getmtime() für jede Datei in jedem verschachtelten Verzeichnis auf und sucht die zuletzt bearbeitete Datei (mit ihrer maximalen Bearbeitungszeit). Der Zeitstempel wird analysiert. konvertiert in eine Zeichenfolge bestehend aus Jahr, Monat, Tag, Stunde, Minuten und Sekunden; ist zurückgekommen; und in der Definition von STATIC_URL enthalten.

Hinweis: Hier müssen Sie den Dev-Server jedes Mal neu laden, wenn Sie Ihre statischen Dateien bearbeiten.

0
Chiefir

Wenn nichts anderes funktioniert, suchen Sie nach dem Dateinamen im Projekt und suchen Sie nach einer unerwarteten Kopie. Wenn Sie irgendwann an einem falschen Ort (einer anderen App) gespeichert haben oder eine neue App von einer alten getrennt haben, spielen beim Laden der Priorität möglicherweise Tricks.

0
pragmar

Anstatt komplizierte Lösungen zu verwenden, können Sie Ihren Includes in den Vorlagen zusätzliche Parameter hinzufügen.

Für statische Enthält:

<script src="{% static 'js/polls/polls.js' %}?version=1"></script>

Für direkt beinhaltet:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />  

Beachten Sie den ?version=1 im Code. Jedes Mal, wenn Sie die Datei css/js ändern, ändern Sie diese Version in der Vorlage, sodass der Browser die Datei neu laden muss.

Und wenn Sie aus unbekannten Gründen überhaupt keine Zwischenspeicherung durchführen möchten, können Sie anstelle der Version den aktuellen Zeitstempel verwenden:

<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
0
The Godfather

Um statische Dateien zu aktualisieren, müssen Sie python manage.py collectstatic erneut ausführen.

0
catavaran