django 配置 Django
Django專案的設定檔案位於專案同名目錄下,名叫settings.py
。這個模組,集合了整個專案方方面面的設定屬性,是專案啟動和提供服務的根本保證。
一、簡述
settings.py
檔案本質上是一個Python模組,帶有模組級別的變數。
下面是一些示例設定:
ALLOWED_HOSTS = ['www.example.com'] DEBUG = False DEFAULT_FROM_EMAIL = '[email protected]'
注:當DEBUG為False時,必須設定ALLOWED_HOSTS
的值。
配置settings.py
時:
- 不允許出現Python層面的語法錯誤;
- 可以使用普通的Python語法動態地設定,例如:
MY_SETTING = [str(i) for i in range(30)]
; - 可以從其它設定檔案匯入值。
二、指定配置檔案
當你使用Django時,你必須告訴它你要使用哪個配置檔案來啟動服務。也就是給環境變數DJANGO_SETTINGS_MODULE
賦值。這個值要使用Python路徑的語法,例如mysite.settings
,而不是作業系統的檔案路徑語法。 注意,被設定的配置檔案應該在Python的匯入查詢路徑中。
預設情況下,我們是不需要設定這個變數的,直接啟動專案就可以。但是,有時候就會有需要使用別的配置啟動專案的情形。
django-admin命令:
當使用django-admin命令時, 可以設定臨時環境變數,或者每次執行該工具時顯式地指定配置檔案。
例如在Unix Bash shell下:
export DJANGO_SETTINGS_MODULE=mysite.settings django-admin runserver
在Windows shell下,也就是cmd環境:
set DJANGO_SETTINGS_MODULE=mysite.settings django-admin runserver
使用--settings
命令列引數可以手工指定:
django-admin runserver --settings=mysite.settings
如果是在伺服器環境中,比如mod_wsgi閘道器介面,需要告訴WSGI,你準備使用哪個設定檔案。這可以使用os.environ
實現:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
再次強調,所有上面的操作都要求mysite.settings
必須在查詢路徑中,否則要用絕對路徑。
三、預設配置
Django的配置檔案並不需要定義所有的選項,每個選項都有一個預設值,這些預設值位於django/conf/global_settings.py
模組中。
Django載入配置的順序是這樣的:
- 從
global_settings.py
中載入預設配置; - 從指定的配置檔案中載入(通常是settings.py),如有必要則覆蓋
global_settings.py
中的預設配置。
有一個簡單的方法可以檢視當前有哪些設定與預設的設定不一樣了,也就是python manage.py diffsettings
命令。
四、在Django環境中使用settings
所謂的在Django環境中,指的是要使用settings的模組(可以簡單的理解為區域網內主機),必須是Django工作狀態中能夠連結的模組,不能是孤零零,額外的一個Python指令碼(外部主機)。這時,可以通過匯入django.conf.settings
來使用配置檔案。 例如:
from django.conf import settings
if settings.DEBUG: # Do something
注意,django.conf.settings
不是一個模組,而是一個物件。 所以不可以單獨匯入每個配置項:
from django.conf.settings import DEBUG # 這是錯誤的做法
五、不要在執行時更改設定
請不要在Django專案執行時改變設定。 例如,不要在檢視中這樣做:
from django.conf import settings
settings.DEBUG = True # 不要這麼做
六、注意安全
因為settings.py
經常會包含敏感的資訊,例如管理員、遠端主機、資料庫的使用者名稱或密碼,你應該盡一切可能來限制對它的訪問。 例如,修改它的檔案許可權使得只有你和Web伺服器使用者可以讀取它。
七、新增自己的配置項
如果要新增自己的配置項,需遵循以下準則:
- 配置項名稱必須全為大寫。
- 不要使用一個已經存在的設定
八、自定義預設設定
如果你想讓預設值來自其它地方而不是django.conf.global_settings
,你可以傳遞一個提供預設設定的模組或類作為default_settings
引數(或第一個位置引數)給configure()方法呼叫。
在下面的示例中,預設的設定來自myapp_defaults
,並且單獨設定DEBUG為True,而不論它在myapp_defaults
中的值是什麼:
from django.conf import settings
from myapp import myapp_defaults settings.configure(default_settings=myapp_defaults, DEBUG=True)
下面的示例和上面一樣,只是使用myapp_defaults
作為一個位置引數:
settings.configure(myapp_defaults, DEBUG=True)
正常情況下,還是不要用這種方式覆蓋預設值。Django的預設配置檔案還是很可靠的,你可以安全地使用它們。 注意,如果你使用自己寫的預設模組,它將完全取代Django的預設模組,你必須指定每個可能用到的配置項的值。 完整的配置項清單,參考django.conf.settings.global_settings
模組。
九、configure()
或DJANGO_SETTINGS_MODULE
二者只能用一
如果你沒有設定DJANGO_SETTINGS_MODULE
環境變數,你必須使用configure()方法來載入配置。。
如果你沒有設定DJANGO_SETTINGS_MODULE
,也沒有呼叫configure(),在首次呼叫配置檔案時Django 將引發一個ImportError異常。也就是我們最常見的問題:為啥我啟動不了Django?為什麼我的指令碼不能呼叫Django的功能?為什麼我的程式碼無法連結到Django內部?
如果你設定了DJANGO_SETTINGS_MODULE
,並訪問了一下設定,然後又呼叫configure(),Django 將引發一個RuntimeError異常,表示已經有配置,不要重複配置。
有個屬性正好可以用於種情況,防止出現異常:
from django.conf import settings
if not settings.configured: settings.configure(myapp_defaults, DEBUG=True)
總結:configure()
或DJANGO_SETTINGS_MODULE
只能用一個,並且只能用一次。不可以兩個都用和都不用。
十、外部指令碼呼叫Django環境:django.setup()
如果你使用外部指令碼, 載入一些Django模板,或者使用ORM來獲取一些資料,除了配置settings模組之外,還需要一個步驟。
也就是在設定DJANGO_SETTINGS_MODULE
或呼叫configure()
之後,還需要呼叫django.setup()
,像這樣:
import django
from django.conf import settings from myapp import myapp_defaults settings.configure(default_settings=myapp_defaults, DEBUG=True) django.setup() # 現在可以訪問Django專案內部的模組了 from myapp import models
請注意,只有真正獨立的外部指令碼,才需要呼叫django.setup()。前面有說到過,當處於伺服器呼叫環境,或通過django-admin呼叫,Django將自動為你載入環境。
django.setup()只能呼叫一次。儘量使用下面的方式,防止重複呼叫:
if __name__ == '__main__':
import django django.setup()