Django 設定¶
Django 設定檔包含您 Django 安裝的所有配置。本文件說明設定的運作方式以及可用的設定。
基本概念¶
設定檔只是一個具有模組級別變數的 Python 模組。
以下是一些範例設定
ALLOWED_HOSTS = ["www.example.com"]
DEBUG = False
DEFAULT_FROM_EMAIL = "webmaster@example.com"
注意
如果您將 DEBUG
設定為 False
,您還需要正確設定 ALLOWED_HOSTS
設定。
因為設定檔是 Python 模組,因此適用以下規則
它不允許 Python 語法錯誤。
它可以使用正常的 Python 語法動態指派設定。例如
MY_SETTING = [str(i) for i in range(30)]
它可以從其他設定檔匯入值。
指定設定¶
- DJANGO_SETTINGS_MODULE¶
當您使用 Django 時,您必須告訴它您正在使用哪些設定。透過使用環境變數 DJANGO_SETTINGS_MODULE
來完成此操作。
DJANGO_SETTINGS_MODULE
的值應採用 Python 路徑語法,例如 mysite.settings
。請注意,設定模組應位於 Python sys.path
中。
django-admin
工具¶
當使用 django-admin 時,您可以設定一次環境變數,或者在每次執行工具時明確傳入設定模組。
範例 (Unix Bash Shell)
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
範例 (Windows Shell)
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"
閱讀 Django mod_wsgi 文件 以獲取更多資訊以及 Django WSGI 應用程式的其他常見元素。
預設設定¶
Django 設定檔不必定義任何設定,如果不需要的話。每個設定都有一個合理的預設值。這些預設值位於模組 django/conf/global_settings.py 中。
以下是 Django 在編譯設定時使用的演算法
從
global_settings.py
載入設定。從指定的設定檔載入設定,並在必要時覆寫全域設定。
請注意,設定檔不應從 global_settings
匯入,因為那是多餘的。
查看您已變更的設定¶
命令 python manage.py diffsettings
會顯示目前設定檔與 Django 預設設定之間的差異。
如需更多資訊,請參閱 diffsettings
文件。
在 Python 程式碼中使用設定¶
在您的 Django 應用程式中,透過匯入物件 django.conf.settings
來使用設定。範例
from django.conf import settings
if settings.DEBUG:
# Do something
...
請注意,django.conf.settings
不是模組,而是一個物件。因此,無法匯入個別的設定
from django.conf.settings import DEBUG # This won't work.
另請注意,您的程式碼不應從 global_settings
或您自己的設定檔匯入。django.conf.settings
抽象化了預設設定和特定站點設定的概念;它呈現一個單一的介面。它還將使用設定的程式碼與設定的位置分離。
在執行階段變更設定¶
您不應在您的應用程式中在執行階段變更設定。例如,不要在視圖中執行此操作
from django.conf import settings
settings.DEBUG = True # Don't do this!
您唯一應該指定設定的位置是在設定檔中。
安全性¶
因為設定檔包含敏感資訊,例如資料庫密碼,您應該盡一切努力限制對它的存取。例如,變更其檔案權限,以便只有您和您的 Web 伺服器的使用者可以讀取它。這在共用託管環境中尤其重要。
可用設定¶
如需可用設定的完整清單,請參閱 設定參考。
建立您自己的設定¶
沒有任何東西阻止您為自己的 Django 應用程式建立自己的設定,但請遵循以下準則
設定名稱必須全部大寫。
不要重新發明已經存在的設定。
對於序列的設定,Django 本身使用清單,但這只是一個慣例。
在不設定 DJANGO_SETTINGS_MODULE
的情況下使用設定¶
在某些情況下,您可能想要略過 DJANGO_SETTINGS_MODULE
環境變數。例如,如果您單獨使用範本系統,您可能不希望設定指向設定模組的環境變數。
在這些情況下,您可以手動配置 Django 的設定。透過呼叫以下程式碼來完成此操作
- django.conf.settings.configure(default_settings, **settings)¶
範例
from django.conf import settings
settings.configure(DEBUG=True)
將您想要的許多關鍵字引數傳遞給 configure()
,每個關鍵字引數代表一個設定及其值。每個引數名稱都應全部大寫,並且與上述設定的名稱相同。如果沒有將特定設定傳遞給 configure()
,並且在稍後需要,Django 將使用預設設定值。
當您在更大的應用程式中使用框架的一部分時,以這種方式配置 Django 大部分是必要的,而且實際上是建議的。
因此,當透過 settings.configure()
配置時,Django 不會對程序環境變數進行任何修改(請參閱 TIME_ZONE
的文件,以了解通常會發生這種情況的原因)。假設在這些情況下,您已經完全控制了自己的環境。
自訂預設設定¶
如果您希望預設值來自 django.conf.global_settings
以外的其他位置,您可以將提供預設設定的模組或類別作為 default_settings
引數(或作為第一個位置引數)傳遞給 configure()
的呼叫中。
在此範例中,預設設定取自 myapp_defaults
,並且無論 myapp_defaults
中的值如何,DEBUG
設定都設定為 True
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_SETTINGS_MODULE
,以某種方式存取了設定值,*然後* 才呼叫 configure()
,Django 會拋出 RuntimeError
,表示設定已經被設定過了。有一個屬性是專門為此而設的
- django.conf.settings.configured¶
例如
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
此外,多次呼叫 configure()
,或是在任何設定被存取後才呼叫 configure()
都是錯誤的。
歸根結底就是:使用 configure()
或 DJANGO_SETTINGS_MODULE
其中之一。不要兩者都用,也不要都不用。
「獨立」使用 Django 時需要呼叫 django.setup()
¶
如果你是「獨立」地使用 Django 的元件,例如:撰寫一個 Python 腳本,載入一些 Django 模板並渲染它們,或是使用 ORM 來提取一些資料,那麼除了設定設定之外,你還需要額外一個步驟。
在設定了 DJANGO_SETTINGS_MODULE
或呼叫了 configure()
之後,你需要呼叫 django.setup()
來載入你的設定並填充 Django 的應用程式註冊表。例如
import django
from django.conf import settings
from myapp import myapp_defaults
settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()
# Now this script or any imported module can use any part of Django it needs.
from myapp import models
請注意,只有當你的程式碼是真正獨立時,才需要呼叫 django.setup()
。當被你的 Web 伺服器或透過 django-admin 呼叫時,Django 會為你處理這個步驟。
django.setup()
只能被呼叫一次。
因此,避免將可重複使用的應用程式邏輯放在獨立腳本中,導致你必須從應用程式中的其他地方匯入該腳本。如果你無法避免這種情況,請將呼叫 django.setup()
的程式碼放在 if
區塊中
if __name__ == "__main__":
import django
django.setup()
另請參閱
- 設定參考
包含核心和 contrib 應用程式設定的完整列表。