鍍金池/ 教程/ Python/ Django 的設(shè)置
點擊劫持保護(hù)
安全問題歸檔
Model 類參考
將遺留數(shù)據(jù)庫整合到Django
關(guān)聯(lián)對象參考
內(nèi)建基于類的視圖的API
聚合
Django 中的用戶認(rèn)證
django.contrib.humanize
Django管理文檔生成器
分頁
使用Django輸出CSV
加密簽名
文件儲存API
安全
Django中的測試
國際化和本地化
為Django編寫首個補(bǔ)丁
條件表達(dá)式
日志
模型元選項
部署靜態(tài)文件
執(zhí)行查詢
使用Django認(rèn)證系統(tǒng)
基于類的視圖
中間件
編寫自定義的django-admin命令
Django 的設(shè)置
格式本地化
數(shù)據(jù)庫訪問優(yōu)化
錯誤報告
基于類的內(nèi)建通用視圖
編寫自定義存儲系統(tǒng)
編寫你的第一個 Django 程序 第3部分
編寫數(shù)據(jù)庫遷移
使用表單
編寫你的第一個 Django 程序 第2部分
編寫你的第一個 Django 程序 第1部分
如何使用會話
系統(tǒng)檢查框架
新手入門
信號
編寫視圖
如何使用WSGI 部署
編寫你的第一個Django應(yīng)用,第6部分
常見的網(wǎng)站應(yīng)用工具
Widgets
內(nèi)建的視圖
模型實例參考
視圖層
Django中的密碼管理
高級教程:如何編寫可重用的應(yīng)用
國際化和本地化
"本地特色"附加功能
TemplateResponse 和 SimpleTemplateResponse
模式編輯器
文件上傳
快速安裝指南
部署 Django
表單 API
表單素材 ( <code>Media</code> 類)
管理文件
其它核心功能
查找 API 參考
表單
Admin
數(shù)據(jù)庫函數(shù)
自定義查找
使用基于類的視圖處理表單
管理操作
開發(fā)過程
編寫你的第一個Django應(yīng)用,第5部分
進(jìn)行原始的sql查詢
模型層
多數(shù)據(jù)庫
編寫你的第一個 Django 程序 第4部分
Django安全
Django 初探
Django異常
重定向應(yīng)用
按需內(nèi)容處理
管理器
視圖裝飾器
驗證器
使用Django輸出PDF
File對象
Django 的快捷函數(shù)
基于類的通用視圖 —— 索引
為模型提供初始數(shù)據(jù)
模板層
URL調(diào)度器
中間件
模型

Django 的設(shè)置

Django 的設(shè)置文件包含你安裝的Django 的所有配置。這頁文檔解釋設(shè)置是如何工作以及有哪些設(shè)置。

基礎(chǔ)

設(shè)置文件只是一個Python 模塊,帶有模塊級別的變量。

下面是一些示例設(shè)置:

ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = 'webmaster@example.com'

如果你設(shè)置DEBUGFalse,那么你應(yīng)該正確設(shè)置ALLOWED_HOSTS 的值。

因為設(shè)置文件是一個Python 模塊,所以適用以下情況:

  • 不允許出現(xiàn)Python 語法錯誤。
  • 它可以使用普通的Python 語法動態(tài)地設(shè)置。例如:
MY_SETTING = [str(i) for i in range(30)]
  • 它可以從其它設(shè)置文件導(dǎo)入值。

指定設(shè)置文件

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)入查找路徑 中。

django-admin 工具

當(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ù)器上(mod_wsgi)

在線上服務(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 的更多和其它常見信息。

默認(rèn)的設(shè)置

Django 的設(shè)置文件不需要定義所有的設(shè)置。每個設(shè)置都有一個合理的默認(rèn)值。這些默認(rèn)值位于django/conf/global_settings.py 模塊中。

下面是Django 用來編譯設(shè)置的算法:

  • global_settings.py 中加載設(shè)置。
  • 從指定的設(shè)置文件中加載設(shè)置,如有必要則覆蓋全局的設(shè)置。

注意,設(shè)置文件不 應(yīng)該從global_settings 中導(dǎo)入,因為這是多余的。

查看改變的設(shè)置

有一個簡單的方法可以查看哪些設(shè)置與默認(rèn)的設(shè)置不一樣了。python manage.py diffsettings 命令顯示當(dāng)前的設(shè)置文件和Django 默認(rèn)設(shè)置之間的差異。

獲取更多信息,查看diffsettings 的文檔。

在Python 代碼中使用設(shè)置

在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ùn)行時改變設(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è)置清單,請參見設(shè)置參考。

創(chuàng)建你自己的設(shè)置

沒有什么可以阻止你為自己的Django 應(yīng)用創(chuàng)建自己的設(shè)置。只需要遵循下面的一些慣例:

  • 設(shè)置名稱全部是大寫
  • 不要使用一個已經(jīng)存在的設(shè)置

對于序列類型的設(shè)置,Django 自己使用元組而不是列表,但這只是一個習(xí)慣。

不用DJANGO_SETTINGS_MODULE 設(shè)置

有些情況下,你可能想繞開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)的設(shè)置

如果你想讓默認(rèn)值來自其它地方而不是django.conf.global_settings,你可以傳遞一個提供默認(rèn)設(shè)置的模塊或類作為default_settings 參數(shù)(或第一個位置參數(shù))給configure() 調(diào)用。

在下面的示例中,默認(rèn)的設(shè)置來自myapp_defaults, 并且設(shè)置DEBUGTrue,而不論它在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。

configure() 和DJANGO_SETTINGS_MODULE 兩者必居其一

如果你沒有設(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。