Ich entwickle eine Django-Site. Ich mache alle meine Änderungen am Live-Server, nur weil es einfacher ist. Das Problem ist, hin und wieder scheint es, eine der * .py-Dateien, an denen ich gerade arbeite, zu cachen. Wenn ich häufig auf "Aktualisieren" klicke, wird zwischen einer älteren Version der Seite und einer neueren Version gewechselt.
Mein Setup entspricht mehr oder weniger dem, was in den Django-Tutorials beschrieben wird: Ссылка
Ich rate es macht das, weil es mehrere Instanzen des WSGI-Handlers auslöst, und abhängig davon, an welchen Handler die HTTP-Anfrage gesendet wird, erhalte ich möglicherweise verschiedene Versionen der Seite . Apache Neustart scheint das Problem zu beheben, aber es ist ärgerlich.
Ich weiß wirklich nicht viel über WSGI oder "MiddleWare" oder irgendwas von dieser Anfrage Handhabung. Ich komme aus einem PHP-Hintergrund, wo alles funktioniert:)
Wie auch immer, was ist eine gute Möglichkeit, dieses Problem zu lösen? Ist das Ausführen des WSGI-Handlers "Daemon-Modus", um das Problem zu beheben? Wenn ja, wie kann ich es im Daemon-Modus ausführen?
Sie können dieses Problem beheben, indem Sie Ihren Code auf dem Live-Server nicht bearbeiten. Ernsthaft, es gibt keine Entschuldigung dafür. Entwickeln Sie lokal mithilfe der Versionskontrolle, und wenn Sie müssen, führen Sie Ihren Server von einem Live-Checkout mit einem Post-Commit-Hook aus, der Ihre neueste Version auscheckt und Apache neu startet.
Das Ausführen des Prozesses im Daemon-Modus wird nicht helfen. Hier ist was passiert:
mod_wsgi erzeugt mehrere identische Prozesse, um eingehende Anfragen für Ihre Django-Site zu bearbeiten. Jeder dieser Prozesse ist ein eigener Python-Interpreter und kann eine eingehende Webanforderung verarbeiten. Diese Prozesse sind persistent (sie werden nicht für jede Anforderung hoch- und heruntergefahren), so dass ein einzelner Prozess tausende Anfragen nacheinander bearbeiten kann. mod_wsgi kann mehrere Webanfragen gleichzeitig bearbeiten, da es mehrere Prozesse gibt.
Der Python-Interpreter jedes Prozesses lädt Ihre Module (Ihre benutzerdefinierten Python-Dateien) immer dann, wenn ein "Importmodul" ausgeführt wird. Im Kontext von Django tritt dies auf, wenn ein neues view.py aufgrund einer Webanfrage benötigt wird. Sobald das Modul geladen ist, befindet es sich im Speicher und Änderungen, die Sie an der Datei vornehmen, werden in diesem Prozess nicht berücksichtigt. Wenn mehr Webanforderungen eingehen, verwendet der Python-Interpreter des Prozesses einfach die Version des Moduls, die bereits im Speicher geladen ist. Sie sehen Inkonsistenzen zwischen den Aktualisierungen, da jede Webanforderung, die Sie erstellen, von verschiedenen Prozessen verarbeitet werden kann. Einige Prozesse haben möglicherweise Ihre Python-Module während früherer Versionen Ihres Codes geladen, während andere diese möglicherweise später geladen haben (da diese Prozesse keine Webanforderung erhalten haben).
Die einfache Lösung: Wenn Sie Ihren Code ändern, starten Sie den Apache-Prozess neu. Meistens ist das so einfach wie das Ausführen als root von der Shell "/etc/init.d/apache2 restart". Ich glaube, ein einfaches Reload funktioniert auch, was schneller ist, "/etc/init.d/apache2 reload"
Die Daemon-Lösung: Wenn Sie mod_wsgi im Daemon-Modus verwenden, müssen Sie lediglich (unix-Befehl) berühren oder Ihre wsgi-Skriptdatei ändern. Um den Beitrag von scrompt.com zu verdeutlichen, führen Änderungen an Ihrem Python-Quellcode nicht dazu, dass mod_wsgi Ihren Code neu lädt. Das Neuladen findet nur statt, wenn die wsgi-Skriptdatei geändert wurde.
Letzter Punkt zu beachten: Ich sprach nur über wsgi als Prozesse zur Vereinfachung zu verwenden. wsgi verwendet tatsächlich Thread-Pools in jedem Prozess. Ich habe dieses Detail nicht als relevant für diese Antwort empfunden, aber Sie können mehr darüber erfahren, indem Sie mod_wsgi .
Lesen Sie die Dokumentation zu mod_wsgi, anstatt sich auf die minimalen Informationen für das Hosting von mod_wsgi auf der Django-Site zu verlassen. Lesen Sie vor allem:
Hier erfahren Sie genau, wie das Nachladen von Quellcode in mod_wsgi funktioniert, einschließlich eines Monitors, den Sie verwenden können, um dieselbe Art von Quellcode zu implementieren, den Django runserver neu lädt. Sehen Sie auch, welche Gespräche darüber, wie man das auf Django anwenden kann.
Da Sie mod_wsgi im eingebetteten Modus verwenden, werden Ihre Änderungen nicht automatisch angezeigt. Sie sehen sie ab und zu, weil Apache manchmal neue Handler-Instanzen startet, die die Updates abfangen.
Sie können dies mithilfe des Daemon-Modus beheben, wie hier hier beschrieben. Insbesondere möchten Sie Ihrer Apache-Konfiguration die folgenden Anweisungen hinzufügen:
%Vor%