2012-12-11 16 views
5

Con il middleware, posso eseguire il codice all'inizio e alla fine di ogni richiesta HTTP.Esegui codice prima di qualsiasi comando di gestione di django

Con le attività di Celery posso ottenere lo stesso utilizzando i segnali task_prerun e task_postrun.

E i comandi di gestione di django? È possibile avere un codice che viene eseguito all'inizio (e possibilmente alla fine) di ogni comando di gestione di django? Tale codice deve anche sapere quale comando di gestione di django sta per essere eseguito (o ha finito di funzionare). C'è un biglietto su un signal on application startup che può o non può fare quello che voglio, ma non è comunque pronto.

risposta

2

Come si stato correttamente non c'è luogo specifico in Django in cui è possibile inserire il codice che viene eseguito ad ogni avvio ...

Ci sono alcuni luoghi che si può essere in grado di 'abuso' per questo scopo, ad esempio, . il codice urls.py o nello models.py deve essere eseguito all'avvio ... (ad esempio, l'amministratore utilizza questa circostanza per il suo admin.autodiscover() in urls.py).

Ci sono anche alcune possibilità per scoprire se il codice è in esecuzione a causa dell'esecuzione di un comando di gestione; è possibile verificare chiaramente gli argomenti della riga di comando tramite sys.argv se contengono comandi di gestione. Un'altra possibilità sarebbe quella di specificare diverse impostazioni per l'esecuzione dell'app tramite server/comando di gestione ....

+0

Questo era il mio pensato anche. Un altro approccio, tutt'altro che del tutto pulito, sarebbe quello di MonkeyPatch django.core.management.base.py, in particolare 'BaseCommand.execute()', e mettere intorno un wrapper. –

+0

Beh, se ti piacciono le patch per le scimmie, certo ... Cosa ti piacerebbe ottenere in primo luogo? –

+0

Beh, per prima cosa, mi piacerebbe che la mia scimmia smettesse di schiantarsi mentre giocavo a WoW. :-) –

0

Se il codice che è necessario aggiungere prima/dopo il comando di gestione non richiede l'accesso ai modelli/impostazioni di Django, allora è possibile semplicemente aggiornare lo script manage.py.

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

io sono sicuro al 100%, ma suppongo post_management_command avrebbero accesso a Django modelli.

Questo è solo esempio di base, in realtà u sarà necessario accertarsi che sys.argv ha almeno due voci e che la seconda voce non inizia con - per impedire chiamate falsi positivi come

./manage.py 
./manage.py -h 
./manage.py --help 
Problemi correlati