django 配置 Django

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加載配置的順序是這樣的:

  1. global_settings.py中加載默認配置;
  2. 從指定的配置文件中加載(一般是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()
相關文章
相關標籤/搜索