2011-12-19 33 views
9

我正在尋找一種方法來重寫/定義一些個人django設置從命令行沒有額外的設置文件。Django:如何通過個別設置manage.py

我現在需要的是每次運行我的管理命令時設置DEBUG設置或日誌記錄級別。但是能夠設置任何東西會很高興。

+0

你想每次都設置DEBUG'蟒蛇manage.py runserver'稱爲還是您的自定義命令'蟒蛇manage.py foo',你想在裏面設置DEBUG? – Kirill 2011-12-19 17:30:18

+0

我想爲任何命令設置任何設置。像這樣:'./manage.py --set =「DEBUG = True」runserver「。也許最簡單的方法就是在settings.py中執行命令行參數值。但我希望有一種方法可以根本不修改源代碼。 – raacer 2011-12-19 18:26:24

回答

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 2011-12-21 00:14:19

+0

嗨基里爾。感謝您的評論。我不確定這一點。另外我不喜歡我的解決方案是我存儲選項值的方式。但我還沒有找到更好的方法來保存進口之間的選項。 – raacer 2011-12-21 14:44:24

+0

爲什麼我需要這是因爲這是在開發過程中調整任何設置的快捷方式。我可以在不修改設置文件的情況下使用設置。而且我可以肯定,我不會忘記將事情改回來(這有時會造成問題)。它也可能用於生產。可以調整cron/celery/etc中單個任務的設置。現在我需要的是使用調試輸出爲我運行一些管理命令,並且僅爲我的合作伙伴提供有用的輸出。我不覺得我應該改變這種需求的命令。 – raacer 2011-12-21 14:52:17

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 2011-12-19 15:34:53

-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 2011-12-20 09:18:59

+0

在Python中沒有這樣的常量,任何變量都可以重新綁定。祝你好運。 – gdonald 2011-12-20 16:18:15

+2

這並不重要。假設設置,而不是常量:) – raacer 2011-12-20 17:04:45

相關問題