Ich möchte, dass der Django-Entwicklungsserver etwas macht, bevor er startet. Dazu habe ich eine neue App, fügte er an die Spitze der INSTALLED_APPS
, und erstellt dann eine management/commands/runserver.py
Datei in der App mit dem folgenden Code:Warum wird im Django-Dev-Server zweimal aufgerufen?
from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
def run(self, *args, **options):
self.stdout.write('About to start running on ' + self.addr)
super(Command, self).run(*args, **options)
(Das, was ich will eigentlich zu tun ist komplizierter als eine Zeile in stdout zu schreiben, natürlich, aber das ist das einfachste Beispiel, das das Problem demonstriert.Der Grund, dass ich run
statt handle
oder eine andere Methode überschreibe, ist, weil ich self.addr
bereits gesetzt werden muss, wenn dieser Code ausgeführt wird.)
Wenn ich ./manage.py runserver
ausführen, erscheint die Zeile "Über den Start auf 127.0.0.1 starten" nicht einmal, aber zweimal bef oder der Server wird gestartet. Warum passiert das und was kann dagegen getan werden?
Sie höchstwahrscheinlich nicht wollen, den Startbefehl bearbeiten , werfen Sie einen Blick auf die Django Startup Hook Funktionalität, die in dieser Antwort erwähnt wird. https://StackOverflow.com/a/16111968/742390 Die automatische Neuladefunktion von Django Runserver, wird Dinge zweimal ausführen, aber es ist harmlos und nur in Dev verwendet. Sie sollten runserver nicht in der Produktion verwenden, in der Produktion wird der Startcode nur einmal ausgeführt. – Pykler
Dies war eigentlich nur für die lokale Entwicklung. – Taymon
In diesem Fall sollten Sie sich nicht viel sorgen, dass es zweimal läuft, da es wirklich nur dev ist. Sie möchten Ihren Code so schreiben, dass er auch in der Produktion funktioniert. Die Bearbeitung des Befehls run funktioniert nicht, wenn Sie ihn schließlich unter uwsgi oder gunicorn bereitstellen. – Pykler