Django 的設(shè)置文件包含你安裝的Django 的所有配置。這頁文檔解釋設(shè)置是如何工作以及有哪些設(shè)置。
設(shè)置文件只是一個Python 模塊,帶有模塊級別的變量。
下面是一些示例設(shè)置:
ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = 'webmaster@example.com'
注
如果你設(shè)置
DEBUG
為False
,那么你應(yīng)該正確設(shè)置ALLOWED_HOSTS
的值。
因為設(shè)置文件是一個Python 模塊,所以適用以下情況:
MY_SETTING = [str(i) for i in range(30)]
DJANGO_SETTINGS_MODULE
當(dāng)你使用Django 時,你必須告訴它你正在使用哪個設(shè)置。這可以使用環(huán)境變量DJANGO_SETTINGS_MODULE
來實現(xiàn)。
DJANGO_SETTINGS_MODULE
的值應(yīng)該使用Python 路徑的語法,例如mysite.settings
。注意,設(shè)置模塊應(yīng)該在Python 的導(dǎo)入查找路徑 中。
當(dāng)使用django-admin
時, 你可以設(shè)置只設(shè)置環(huán)境變量一次,或者每次運(yùn)行該工具時顯式傳遞設(shè)置模塊。
例如(Unix Bash shell):
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
例如(Windows shell):
set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
使用--settings 命令行參數(shù)可以手工指定設(shè)置:
django-admin runserver --settings=mysite.settings
在線上服務(wù)器環(huán)境中,你需要告訴WSGI 的application 使用哪個設(shè)置文件??梢允褂胦s.environ 實現(xiàn):
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
閱讀Django mod_wsgi 文檔 以獲得關(guān)于Django WSGI application 的更多和其它常見信息。
Django 的設(shè)置文件不需要定義所有的設(shè)置。每個設(shè)置都有一個合理的默認(rèn)值。這些默認(rèn)值位于django/conf/global_settings.py
模塊中。
下面是Django 用來編譯設(shè)置的算法:
global_settings.py
中加載設(shè)置。注意,設(shè)置文件不 應(yīng)該從global_settings 中導(dǎo)入,因為這是多余的。
有一個簡單的方法可以查看哪些設(shè)置與默認(rèn)的設(shè)置不一樣了。python manage.py
diffsettings
命令顯示當(dāng)前的設(shè)置文件和Django 默認(rèn)設(shè)置之間的差異。
獲取更多信息,查看diffsettings
的文檔。
在Django 應(yīng)用中,可以通過導(dǎo)入django.conf.settings
對象來使用設(shè)置。例如:
from django.conf import settings
if settings.DEBUG:
# Do something
注意,django.conf.settings
不是一個模塊 —— 它是一個對象。所以不可以導(dǎo)入每個單獨的設(shè)置:
from django.conf.settings import DEBUG # This won't work.
還要注意,你的代碼不應(yīng)該 從global_settings
或你自己的設(shè)置文件中導(dǎo)入。django.conf.settings
抽象出默認(rèn)設(shè)置和站點特定設(shè)置的概念;它表示一個單一的接口。它還可以將代碼從你的設(shè)置所在的位置解耦出來。
請不要在應(yīng)用運(yùn)行時改變設(shè)置。例如,不要在視圖中這樣做:
from django.conf import settings
settings.DEBUG = True # Don't do this!
給設(shè)置賦值的唯一地方是在設(shè)置文件中。
因為設(shè)置文件包含敏感的信息,例如數(shù)據(jù)庫密碼,你應(yīng)該盡一切可能來限制對它的訪問。例如,修改它的文件權(quán)限使得只有你和Web 服務(wù)器使用者可以讀取它。這在共享主機(jī)的環(huán)境中特別重要。
完整的可用設(shè)置清單,請參見設(shè)置參考。
沒有什么可以阻止你為自己的Django 應(yīng)用創(chuàng)建自己的設(shè)置。只需要遵循下面的一些慣例:
對于序列類型的設(shè)置,Django 自己使用元組而不是列表,但這只是一個習(xí)慣。
有些情況下,你可能想繞開DJANGO_SETTINGS_MODULE
環(huán)境變量。例如,如果你正在使用自己的模板系統(tǒng),而你不想建立指向設(shè)置模塊的環(huán)境變量。
這些情況下,你可以手工配置Django 的設(shè)置。實現(xiàn)這點可以通過調(diào)用:
django.conf.settings.configure(default_settings, **settings)
例如:
from django.conf import settings
settings.configure(DEBUG=True)
可以傳遞configure()
給任意多的關(guān)鍵字參數(shù),每個關(guān)鍵字參數(shù)表示一個設(shè)置及其值。每個參數(shù)的名稱應(yīng)該都是大寫,與上面講到的設(shè)置名稱相同。如果某個設(shè)置沒有傳遞給configure()
而且在后面需要使用到它,Django 將使用其默認(rèn)設(shè)置的值。
當(dāng)你在一個更大的應(yīng)用中使用到Django 框架的一部分,有必要以這種方式配置Django —— 而且實際上推薦這么做。
所以,當(dāng)通過settings.configure()
配置時,Django 不會對進(jìn)程的環(huán)境變量做任何修改(參見TIME_ZONE
文檔以了解為什么會發(fā)生)。在這些情況下,它假設(shè)你已經(jīng)完全控制你的環(huán)境變量。
如果你想讓默認(rèn)值來自其它地方而不是django.conf.global_settings
,你可以傳遞一個提供默認(rèn)設(shè)置的模塊或類作為default_settings
參數(shù)(或第一個位置參數(shù))給configure()
調(diào)用。
在下面的示例中,默認(rèn)的設(shè)置來自myapp_defaults
, 并且設(shè)置DEBUG
為True
,而不論它在myapp_defaults
中的值是什么:
from django.conf import settings
from myapp import myapp_defaults
settings.configure(default_settings=myapp_defaults, DEBUG=True)
下面的示例和上面一樣,只是使用myapp_defaults
作為一個位置參數(shù):
settings.configure(myapp_defaults, DEBUG=True)
正常情況下,你不需要用這種方式覆蓋默認(rèn)值。Django 的默認(rèn)值以及足夠好使,你可以安全地使用它們。注意,如果你傳遞一個新的默認(rèn)模塊,你將完全取代 Django 的默認(rèn)值,所以你必須指定每個可能用到的設(shè)置的值。完整的設(shè)置清單,參見django.conf.settings.global_settings
。
如果你沒有設(shè)置DJANGO_SETTINGS_MODULE
環(huán)境變量,你 必須 在使用到讀取設(shè)置的任何代碼之前調(diào)用configure()
。
如果你沒有設(shè)置DJANGO_SETTINGS_MODULE
且沒有調(diào)用 configure()
,在首次訪問設(shè)置時Django 將引發(fā)一個ImportError
異常。
如果你設(shè)置了DJANGO_SETTINGS_MODULE
,并訪問了一下設(shè)置,然后 調(diào)用configure()
,Django 將引發(fā)一個RuntimeError
表示該設(shè)置已經(jīng)有配置。有個屬性正好可以用于這個情況:
例如:
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
另外,多次調(diào)用configure()
或者在設(shè)置已經(jīng)訪問過之后調(diào)用 configure()
都是錯誤的。
歸結(jié)為一點:只使用configure()
或 DJANGO_SETTINGS_MODULE
中的一個。不可以兩個都用和都不用。
另見
設(shè)置參考 包含完整的核心設(shè)置和contrib 應(yīng)用設(shè)置的列表。
譯者:Django 文檔協(xié)作翻譯小組,原文:Overview。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。