Django項目的設置文件位於項目同名目錄下,名叫settings.py
。這個模塊,集合了整個項目方方面面的設置屬性,是項目啓動和提供服務的根本保證。python
1、簡述
settings.py
文件本質上是一個Python模塊,帶有模塊級別的變量。web
下面是一些示例設置:shell
ALLOWED_HOSTS = ['www.example.com'] DEBUG = False DEFAULT_FROM_EMAIL = 'webmaster@example.com'
注:當DEBUG爲False時,必須設置ALLOWED_HOSTS
的值。數據庫
配置settings.py
時:django
- 不容許出現Python層面的語法錯誤;
- 可使用普通的Python語法動態地設置,例如:
MY_SETTING = [str(i) for i in range(30)]
; - 能夠從其它設置文件導入值。
2、指定配置文件
當你使用Django時,你必須告訴它你要使用哪一個配置文件來啓動服務。也就是給環境變量DJANGO_SETTINGS_MODULE
賦值。這個值要使用Python路徑的語法,例如mysite.settings
,而不是操做系統的文件路徑語法。 注意,被設置的配置文件應該在Python的導入查找路徑中。安全
默認狀況下,咱們是不須要設置這個變量的,直接啓動項目就能夠。可是,有時候就會有須要使用別的配置啓動項目的情形。服務器
django-admin命令:app
當使用django-admin命令時, 能夠設置臨時環境變量,或者每次運行該工具時顯式地指定配置文件。工具
例如在Unix Bash shell下:spa
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
必須在查找路徑中,不然要用絕對路徑。
3、默認配置
Django的配置文件並不須要定義全部的選項,每一個選項都有一個默認值,這些默認值位於django/conf/global_settings.py
模塊中。
Django加載配置的順序是這樣的:
- 從
global_settings.py
中加載默認配置; - 從指定的配置文件中加載(一般是settings.py),若有必要則覆蓋
global_settings.py
中的默認配置。
有一個簡單的方法能夠查看當前有哪些設置與默認的設置不同了,也就是python manage.py diffsettings
命令。
4、在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 # 這是錯誤的作法
5、不要在運行時更改設置
請不要在Django項目運行時改變設置。 例如,不要在視圖中這樣作:
from django.conf import settings settings.DEBUG = True # 不要這麼作
6、注意安全
由於settings.py
常常會包含敏感的信息,例如管理員、遠程主機、數據庫的用戶名或密碼,你應該盡一切可能來限制對它的訪問。 例如,修改它的文件權限使得只有你和Web服務器使用者能夠讀取它。
7、添加本身的配置項
若是要添加本身的配置項,需遵循如下準則:
- 配置項名稱必須全爲大寫。
- 不要使用一個已經存在的設置
8、自定義默認設置
若是你想讓默認值來自其它地方而不是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
模塊。
9、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
只能用一個,而且只能用一次。不能夠兩個都用和都不用。
10、外部腳本調用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()