2011-12-19 17 views
9

Sto cercando un modo per sovrascrivere/definire alcune impostazioni personali di django dalla riga di comando senza ulteriori file di impostazioni.Django: come passare le singole impostazioni per manage.py

Ciò che mi serve adesso è impostare l'impostazione DEBUG o il livello di registrazione ogni volta che eseguo il comando di gestione. Ma sarebbe bello essere in grado di impostare qualsiasi cosa.

+0

vuoi impostare DEBUG ogni volta 'python manage.py runserver' chiamato o hai il comando personalizzato' python manage.py foo' e vuoi impostare DEBUG al suo interno? – Kirill

+0

Voglio impostare qualsiasi impostazione per qualsiasi comando. In questo modo: './manage.py --set =" DEBUG = True "runserver'. Forse il modo più semplice è eseguire un valore del parametro della riga di comando direttamente in settings.py. Ma speravo che ci fosse un modo per non modificare affatto il codice sorgente. – raacer

risposta

6

Ecco la mia soluzione. Aggiungi il codice qui sotto nella parte inferiore del tuo file delle impostazioni.

# Process --set command line option 
import sys 
# This module can be imported several times, 
# check if the option has been retrieved already. 
if not hasattr(sys, 'arg_set'): 
    # Search for the option. 
    args = filter(lambda arg: arg[:6] == '--set=', sys.argv[1:]) 
    if len(args) > 0: 
     expr = args[0][6:] 
     # Remove the option from argument list, because the actual command 
     # knows nothing about it. 
     sys.argv.remove(args[0]) 
    else: 
     # --set is not provided. 
     expr = '' 
    # Save option value for future use. 
    sys.arg_set = expr 
# Execute the option value. 
exec sys.arg_set 

Poi basta passare qualsiasi codice a qualsiasi comando di gestione:

./manage.py runserver --set="DEBUG=True ; TEMPLATE_DEBUG=True" 
+0

Penso che questo sia solo un modo possibile poiché Django non offre alcun hook per la pre-elaborazione degli argomenti da riga di comando. Mi chiedo perché ne hai bisogno? – Kirill

+0

Ciao Kirill. Grazie per il tuo commento. Non ero sicuro di questo. Inoltre, ciò che non mi piace della mia soluzione è il modo in cui memorizzo il valore dell'opzione. Ma non ho trovato un modo migliore per salvare l'opzione tra le importazioni. – raacer

+0

Perché ho bisogno di questo è solo perché questo è un modo semplice e veloce per modificare qualsiasi impostazione durante il processo di sviluppo. Posso giocare con le impostazioni senza modificare il file delle impostazioni. E posso essere sicuro che non dimenticherò di cambiare le cose (questo a volte rende il problema). Inoltre può essere utile per la produzione. È possibile modificare le impostazioni per le singole attività su cron/sedici/ecc. In questo momento ciò di cui ho bisogno è di eseguire alcuni comandi di gestione per me con l'output di debug e per il mio partner con solo output utili. Non mi sento come dovrei cambiare il comando per tali bisogni. – raacer

2

È possibile aggiungere un'opzione personalizzata (ad es. Livello di registro) al proprio comando. Docs

Esempio:

from optparse import make_option 

class Command(BaseCommand): 
    option_list = BaseCommand.option_list + (
     make_option('--delete', 
      action='store_true', 
      dest='delete', 
      default=False, 
      help='Delete poll instead of closing it'), 
     ) 
    # ... 
+0

Grazie, Denis. Certo che posso. Ma non voglio aggiungere questa opzione a ciascun comando in ogni progetto. Sto cercando un metodo più universale. – raacer

-1

È possibile effettuare la settings.py più consapevoli del suo ambiente attuale:

DEBUG = socket.gethostname().find('example.com') == -1 

Ecco un'opzione per diversi database, quando il test:

'ENGINE': 'sqlite3' if 'test_coverage' in sys.argv else 'django.db.backends.postgresql_psycopg2', 
+0

Grazie. Questo metodo richiede modifiche per qualsiasi costante che ho bisogno di sovrascrivere. Non esattamente quello che voglio. – raacer

+0

Non esiste una costante in Python, qualsiasi variabile può essere reindirizzata. In bocca al lupo. – gdonald

+2

Questo non è importante. Diciamo impostazione, non costante :) – raacer

Problemi correlati