2011-12-19 3 views
9

Я ищу способ переопределить/определить некоторые отдельные параметры django из командной строки без дополнительных файлов настроек.Django: как передать индивидуальные настройки для manage.py

Теперь мне нужно установить настройку DEBUG или уровень ведения журнала каждый раз при запуске моей команды управления. Но было бы неплохо иметь возможность что-либо установить.

+0

ли Вы хотите установить отлаживать каждый раз, когда 'питон manage.py runserver' называется или у вас есть пользовательские команды' питон manage.py foo', и вы хотите установить DEBUG внутри него? – Kirill

+0

Я хочу установить любую настройку для любой команды. Например: './manage.py --set =" DEBUG = True "runerver'. Возможно, самый простой способ - выполнить значение параметра командной строки прямо в settings.py. Но я надеялся, что есть способ вообще не изменять исходный код. – raacer

ответ

6

Вот мое решение. Добавьте код ниже в конец файла настроек.

# 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 

Тогда просто передать код для любой команды управления:

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

Я думаю, что это возможно только потому, что Django не предлагает никакого крючка для препроцессорных аргументов командной строки. Интересно, зачем вам это нужно? – Kirill

+0

Привет Кирилл. Спасибо за ваш комментарий. Я не был уверен в этом. Также то, что мне не нравится в моем решении, - это способ хранения значения параметра. Но я не нашел лучшего способа сохранить опцию между импортом. – raacer

+0

Зачем мне это нужно только потому, что это быстрый и простой способ настроить любые настройки в процессе разработки. Я могу играть с настройками без изменения файла настроек. И я могу быть уверен, что не забуду изменить ситуацию (иногда это проблема). Также это может быть полезно для производства. Можно настроить настройки для отдельной задачи на cron/celery/etc. Сейчас мне нужно запустить некоторую команду управления для меня с выходом отладки и для моего партнера только с полезным выходом. Я не чувствую, что должен изменить команду для таких потребностей. – raacer

2

К вашей команде можно добавить пользовательскую опцию (например, уровень журнала). Docs

Пример:

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

Спасибо, Денис. Конечно я могу. Но я не хочу добавлять этот параметр к каждой команде в каждом проекте. Я ищу еще один универсальный метод. – raacer

-1

Вы можете сделать settings.py более осведомлены это текущая среда:

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

Вот вариант для различных баз данных при тестировании:

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

Спасибо. Этот метод требует изменений для любой константы, которую мне нужно переопределить. Не совсем то, что я хочу. – raacer

+0

В Python нет такой вещи, как константа, любая переменная может быть переопределена. Удачи. – gdonald

+2

Это не важно. Предположим, что настройка, а не константа :) – raacer