2011-12-19 12 views
9

Estoy buscando una manera de anular/definir algunos ajustes de django individuales desde la línea de comandos sin archivos de configuración adicionales.Django: cómo pasar la configuración individual a manage.py

Lo que necesito ahora es establecer la configuración DEPURAR o el nivel de registro cada vez que ejecuto mi comando de administración. Pero sería bueno poder establecer cualquier cosa.

+0

es lo que quieres para establecer DEBUG cada vez que 'python manage.py runserver' llamada o si tiene su comando personalizado' python manage.py foo' y quieres establecer DEBUG dentro de él? – Kirill

+0

Quiero establecer cualquier configuración para cualquier comando. De esta manera: './manage.py --set =" DEBUG = True "runserver'. Quizás la forma más fácil es ejecutar un valor de parámetro de línea de comando directamente en settings.py. Pero esperaba que hubiera una manera de no modificar el código fuente en absoluto. – raacer

Respuesta

6

Aquí está mi solución. Agregue el código a continuación al final de su archivo de configuración.

# 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 

Entonces sólo tiene que pasar ningún código para cualquier comando de gestión:

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

Creo que esto solo es posible porque Django no ofrece ningún enganche para preprocesar argumentos de línea de comandos. Me pregunto por qué lo necesitas? – Kirill

+0

Hola Kirill. Gracias por tu comentario. No estaba seguro de esto. Además, lo que no me gusta de mi solución es la forma en que almaceno el valor de la opción. Pero no he encontrado una mejor manera de guardar la opción entre las importaciones. – raacer

+0

Por qué necesito esto es solo porque esta es una manera rápida y fácil de ajustar cualquier configuración durante el proceso de desarrollo. Puedo jugar con la configuración sin modificar el archivo de configuración. Y puedo estar seguro de que no me olvidaré de cambiar las cosas (esto a veces crea problemas). También puede ser útil para la producción. Es posible ajustar la configuración para tareas individuales en cron/apio/etc. En este momento, lo que necesito es ejecutar algún comando de administración para mí con la salida de depuración, y para mi compañero con salida útil solamente. No siento que deba cambiar el comando para tales necesidades. – raacer

2

Puede agregar una opción personalizada (por ejemplo, nivel de registro) a su comando. Docs

Ejemplo:

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

Gracias Denis. Seguro que puedo. Pero no quiero agregar esta opción a cada comando en cada proyecto. Estoy buscando un método más universal. – raacer

-1

Usted puede hacer su settings.py más conscientes de su ambiente actual:

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

Aquí hay una opción para diferentes bases de datos cuando la prueba:

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

Gracias. Este método requiere modificaciones para cualquier constante que deba anular. No es exactamente lo que quiero. – raacer

+0

No existe una constante en Python, cualquier variable puede volver a vincularse. Buena suerte. – gdonald

+2

Esto no es importante. Digamos ajuste, no constante :) – raacer

Cuestiones relacionadas