2010-05-06 6 views
46

Mi piacerebbe avere queste righe di codice eseguito all'avvio del server (sia per lo sviluppo e la produzione):Dove inserire il codice di avvio di Django?

from django.core import management 
management.call_command('syncdb', interactive=False) 

Mettere in settings.py non funziona, in quanto richiede le impostazioni da caricare già.

Inserirli in una vista e accedere a quella vista esternamente non funziona, in quanto vi sono alcuni middleware che utilizzano il database e quelli non funzioneranno e non mi permetteranno di accedere alla vista.

Inserirli in un middleware funzionerebbe, ma questo verrebbe chiamato ogni volta che si accede alla mia app. Una possibile soluzione potrebbe essere quella di creare un middleware che faccia tutto il lavoro e quindi rimuoverlo da MIDDLEWARE_CLASSES in modo che non venga più chiamato. Posso farlo senza troppe patch per le scimmie?

risposta

53

Scrivere il middleware che esegue questo in __init__ e successivamente aumentare django.core.exceptions.MiddlewareNotUsed da __init__, django lo rimuoverà per tutte le richieste :). __init__ viene richiamato all'avvio, non alla prima richiesta, quindi non bloccherà il tuo primo utente.

Si parla di aggiungere un segnale di avvio, ma che non sarà disponibile a breve (un grave problema per esempio, è quando questo segnale deve essere inviato)

biglietteria correlati: https://code.djangoproject.com/ticket/13024

Aggiornamento: Django 1.7 include il supporto per questo. (Documentation, come aggiunto dal biglietto)

+0

Grazie per la risposta rapida. Questo è esattamente ciò di cui ho bisogno. –

+4

Questo è un bel trucco di cui non ero a conoscenza. –

+2

Secondo http://stackoverflow.com/questions/6791911/execute-code-when-django-styles-once-only, questo può essere problematico. Si suggerisce di inserire la funzione di avvio in urls.py – Michael

1

Se si utilizza mod_wsgi si può mettere in app partenza WSGI

4

Se si sta utilizzando Apache/mod_wsgi per entrambi, utilizzare il file di script WSGI descritto:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

Aggiungi quello che ti serve dopo che le traduzioni della lingua sono attivate.

Così:

import sys 

sys.path.insert(0, '/usr/local/django/mysite') 

import settings 

import django.core.management 
django.core.management.setup_environ(settings) 
utility = django.core.management.ManagementUtility() 
command = utility.fetch_command('runserver') 

command.validate() 

import django.conf 
import django.utils 

django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE) 

# Your line here. 
django.core.management.call_command('syncdb', interactive=False) 

import django.core.handlers.wsgi 

application = django.core.handlers.wsgi.WSGIHandler() 
+0

Sembra un po 'diverso perché uso twod.wsgi. Inoltre, mi piacerebbe farlo anche sul server di sviluppo. E non andrei ad un livello così basso come l'apache. L'idea è che potrei non voler fornire l'accesso ssh dello sviluppatore dell'app al server, ma permettergli di usare l'admin di django inserendolo nel suo codice di avvio. –

3

È possibile creare un comando personalizzato e scrivere il codice nella funzione manico. dettagli qui https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Quindi è possibile creare uno script di avvio che esegue il server django, quindi esegue il nuovo comando personalizzato.

+1

Questa è una scelta sbagliata che si basa su uno script wrapper attorno all'avvio del server. Cosa succede se qualcuno si dimentica di avviare il server senza lo script? – KillianDS

+0

Sono d'accordo con @ [KillianDS] (http://stackoverflow.com/users/243870/killiands). Eppure, è una possibilità. Ma poi dovresti usare il tuo wrapper come entry point per il server, che può essere qualsiasi piattaforma, mod_wsgi, motore di app, tornado, ecc. –

0

Ecco come io lavoro in giro per il segnale di avvio mancante per Django: https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py Il codice che viene chiamato non è specifico per il mio progetto djangosite, ma il trucco per farlo chiamato scrivendo un'applicazione speciale (sulla base di un idea di Ross McFarland) dovrebbe funzionare per altri ambienti. Luc