1. 程式人生 > >django 配置 Django

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

  1. global_settings.py中載入預設配置;
  2. 從指定的配置檔案中載入(通常是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()