我們僅僅處理一個單一的設定檔案 settings.py檔案由django-admin.py startproject命令產生。但是當你準備要進行配置的時候,你將發現你需要多個設定檔以使你的開發環境和產品環境相獨立。 比如,你可能不想每次在本地機器上測試代碼改變的時候將DEBUG從False 改為True。Django通過使用多個設定檔而使得這種情況很容易得到避免。
如果你想把你的設定檔按照產品設定和開發設定組織起來,你可以通過下面三種方法的其中一種達到這個目的。
- 設定成兩個全面的,彼此獨立的設定檔
- 設定一個基本的設定檔(比如,為了開發)和第二個(為了產品)設定檔,第二個設定檔僅僅從基本的那個設定檔匯入配置,並對需要定義的進行複寫.
- 使用一個單獨的設定檔,此設定檔包含一個Python的邏輯判斷根據上下文環境改變設定。
我們將會在依次解釋這幾種方式
首先,最基本的方法是定義兩個單獨的設定檔。 如果你是跟隨之前的例子做下來的,那麼你已經有了一個settings.py了,現在你只需要將它複製一份並命名為settings_production.py(檔案名稱可以按照你自己的喜好定義),在這個新檔案中改變DEBUG等設定。
第二種方法比較類似,但是減少了許多冗餘。 作為使用兩個內容大部分相同的設定檔的替代方式,你可以使用一個檔案為基本檔案,另外一個檔案從基本檔案中匯入相關設定。 例如
# settings.pyDEBUG = TrueTEMPLATE_DEBUG = DEBUGDATABASE_ENGINE = 'postgresql_psycopg2'DATABASE_NAME = 'devdb'DATABASE_USER = ''DATABASE_PASSWORD = ''DATABASE_PORT = ''# ...# settings_production.pyfrom settings import *DEBUG = TEMPLATE_DEBUG = FalseDATABASE_NAME = 'production'DATABASE_USER = 'app'DATABASE_PASSWORD = 'letmein'
此處,settings_production.py 從settings.py 匯入所有的設定,僅僅只是重新定義了產品模式下需要特殊處理的設定。 在這個案例中,DEBUG 被設定為False,但是我們已經對產品模式設定了不同的資料庫訪問參數。 (後者將向你示範你可以重新定義 任何 設定,並不只是象 DEBUG 這樣的基本設定。)
最終,最精簡的達到兩個配置環境設定的方案是使用一個設定檔,在此設定檔中根據不同的環境進行設定。 一個達到這個目的的方法是檢查當前的主機名稱。 例如:
# settings.pyimport socketif socket.gethostname() == 'my-laptop': DEBUG = TEMPLATE_DEBUG = Trueelse: DEBUG = TEMPLATE_DEBUG = False# ...
在這裡,我們從python標準庫匯入了socket 模組,使用它來檢查當前系統的主機名稱。 我們可以通過檢查主機名稱來確認代碼是否運行在產品伺服器上。
一個關鍵是設定檔僅僅是包含python代碼的檔案。你可以從其他檔案匯入這些python代碼,可以通過這些代碼執行任意的邏輯判斷等操作。 如果你打算按照這種方案走下去,請確定這些設定檔中的代碼是足夠安全(防彈)的。 如果這個設定檔拋出任何的異常,Django都有可能會發生很嚴重的崩潰。
重新命名settings.py
隨便將你的settings.py重新命名為settings_dev.py或settings/dev.py或foobar.py,Django 並不在乎你的設定檔取什麼名字,只要你告訴它你使用的哪個設定檔就可以了。
但是如果你真的重新命名了由django-admin.py startproject 命令建立的settings.py檔案,你會發現manage.py會給出一個錯誤資訊說找不到設定檔。 那是由於它嘗試從這個檔案中匯入一個叫做settings的模組,你可以通過修改manage.py 檔案,將 import settings 語句改為匯入你自己的模組,或者使用django-admin.py而不是使用manage.py,在後一種方式中你需要設定 DJANGO_SETTINGS_MODULE 環境變數為你的設定檔所在的python 路徑.(比如'mysite.settings')。
DJANGO_SETTINGS_MODULE
通過這種方式的代碼改變後,本章的下一部分將集中在對具體環境(比如Apache)的發布所需要的指令上。 這些指令針對每一種環境都不同,但是有一件事情是相同的。 在每一種環境中,你都需要告訴Web伺服器你的DJANGO_SETTINGS_MODULE是什麼,這是你的Django應用程式的進入點。 DJANGO_SETTINGS_MODULE指向你的設定檔,在你的設定檔中指向你的ROOT_URLCONF,在ROOT_URLCONF中指向了你的視圖以及其他的部分。
DJANGO_SETTINGS_MODULE是你的設定檔的python的路徑 比如,假設mysite是在你的Python路徑中,DJANGO_SETTINGS_MODULE對於我們進行中的例子就是'mysite.settings'。