2012-12-11 8 views
5

Mit Middleware kann ich Code am Anfang und Ende jeder HTTP-Anfrage ausführen.Code vor jedem django Verwaltungsbefehl ausführen

Mit Sellerie Aufgaben kann ich das gleiche erreichen mit den task_prerun und task_postrun Signale.

Was ist mit Django-Managementbefehlen? Ist es möglich, Code zu haben, der am Anfang (und möglicherweise am Ende) jedes django-Verwaltungsbefehls läuft? Ein solcher Code muss auch wissen, welcher Django-Verwaltungsbefehl gerade ausgeführt wird (oder beendet wurde). Es gibt ein Ticket über eine signal on application startup, die kann oder nicht tun, was ich will, aber es ist sowieso nicht bereit.

Antwort

2

Wie Sie richtig keine bestimmten Ort gibt es in Django angeben, wo Sie Code setzen können, die bei jedem Start ausgeführt wird ...

Es gibt einige Orte, die Sie könnten für diesen Zweck zu ‚Missbrauch‘ in der Lage sein, zB . Code in urls.py oder in der models.py sollte beim Start ausgeführt werden ... (z. B. der Admin verwendet diese Umstände für seine admin.autodiscover() in urls.py).

Es gibt auch einige Möglichkeiten herauszufinden, ob der Code aufgrund der Ausführung eines Verwaltungsbefehls ausgeführt wird; Sie können die Befehlszeilenargumente einfach über sys.argv überprüfen, wenn sie Verwaltungsbefehle enthalten. Eine andere Möglichkeit wäre, verschiedene Einstellungen für die Ausführung der App über Server/Management-Befehl ....

+0

war mein dachte auch. Ein anderer, weniger als vollständig sauberer Ansatz wäre MonkeyPatch django.core.management.base.py, speziell 'BaseCommand.execute()', und einen Wrapper darum zu legen. –

+0

Nun, wenn Sie Affe-Patching sicher mögen ... Was möchten Sie in erster Linie erreichen? –

+0

Nun, zum einen möchte ich, dass mein Affe aufhört zu stürzen, während ich WoW spiele. :-) –

0

Wenn der Code, den Sie vor/nach dem Management-Befehl hinzufügen müssen nicht Zugriff auf Django Modelle/Einstellungen dann können Sie Aktualisieren Sie einfach manage.py Skript.

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

from django.core.management import execute_from_command_line 
from startup import pre_management_command, post_management_command 

pre_management_command(sys.argv[1], sys.argv[2:]) 
execute_from_command_line(sys.argv) 
post_management_command(sys.argv[1], sys.argv[2:]) 

Ich bin nicht 100% sicher, aber ich nehme an post_management_command Zugangsmodelle django haben würde.

Dies ist nur einfaches Beispiel, u müssen in Wirklichkeit um sicherzustellen, dass sys.argv mindestens zwei Einträge aufweist, und dass der zweite Eintrag beginnt nicht mit - wie falsch positive Anrufe zu verhindern

./manage.py 
./manage.py -h 
./manage.py --help 
Verwandte Themen