# Django 的設置 #
Django 的設置文件包含你安裝的Django 的所有配置。這頁文檔解釋設置是如何工作以及有哪些設置。
## 基礎 ##
設置文件只是一個Python 模塊,帶有模塊級別的變量。
下面是一些示例設置:
```
ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = 'webmaster@example.com'
```
> 注
>
> 如果你設置`DEBUG` 為`False`,那么你應該正確設置`ALLOWED_HOSTS` 的值。
因為設置文件是一個Python 模塊,所以適用以下情況:
+ 不允許出現Python 語法錯誤。
+ 它可以使用普通的Python 語法動態地設置。例如:
```
MY_SETTING = [str(i) for i in range(30)]
```
+ 它可以從其它設置文件導入值。
## 指定設置文件 ##
`DJANGO_SETTINGS_MODULE`
當你使用Django 時,你必須告訴它你正在使用哪個設置。這可以使用環境變量`DJANGO_SETTINGS_MODULE` 來實現。
`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):
```
set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
```
使用--settings 命令行參數可以手工指定設置:
```
django-admin runserver --settings=mysite.settings
```
### 在服務器上(mod_wsgi) ###
在線上服務器環境中,你需要告訴WSGI 的application 使用哪個設置文件。可以使用os.environ 實現:
```
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
```
閱讀[Django mod_wsgi 文檔](http://python.usyiyi.cn/django/howto/deployment/wsgi/modwsgi.html) 以獲得關于Django WSGI application 的更多和其它常見信息。
## 默認的設置 ##
Django 的設置文件不需要定義所有的設置。每個設置都有一個合理的默認值。這些默認值位于`django/conf/global_settings.py` 模塊中。
下面是Django 用來編譯設置的算法:
+ 從`global_settings.py` 中加載設置。
+ 從指定的設置文件中加載設置,如有必要則覆蓋全局的設置。
注意,設置文件不 應該從global_settings 中導入,因為這是多余的。
### 查看改變的設置 ###
有一個簡單的方法可以查看哪些設置與默認的設置不一樣了。python `manage.py` `diffsettings` 命令顯示當前的設置文件和Django 默認設置之間的差異。
獲取更多信息,查看`diffsettings` 的文檔。
## 在Python 代碼中使用設置 ##
在Django 應用中,可以通過導入`django.conf.settings` 對象來使用設置。例如:
```
from django.conf import settings
if settings.DEBUG:
# Do something
```
注意,`django.conf.settings` 不是一個模塊 —— 它是一個對象。所以不可以導入每個單獨的設置:
```
from django.conf.settings import DEBUG # This won't work.
```
還要注意,你的代碼不應該 從`global_settings` 或你自己的設置文件中導入。`django.conf.settings` 抽象出默認設置和站點特定設置的概念;它表示一個單一的接口。它還可以將代碼從你的設置所在的位置解耦出來。
## 運行時改變設置 ##
請不要在應用運行時改變設置。例如,不要在視圖中這樣做:
```
from django.conf import settings
settings.DEBUG = True # Don't do this!
```
給設置賦值的唯一地方是在設置文件中。
## 安全 ##
因為設置文件包含敏感的信息,例如數據庫密碼,你應該盡一切可能來限制對它的訪問。例如,修改它的文件權限使得只有你和Web 服務器使用者可以讀取它。這在共享主機的環境中特別重要。
## 可用的設置 ##
完整的可用設置清單,請參見[設置參考](http://python.usyiyi.cn/django/ref/settings.html)。
## 創建你自己的設置 ##
沒有什么可以阻止你為自己的Django 應用創建自己的設置。只需要遵循下面的一些慣例:
+ 設置名稱全部是大寫
+ 不要使用一個已經存在的設置
對于序列類型的設置,Django 自己使用元組而不是列表,但這只是一個習慣。
## 不用DJANGO_SETTINGS_MODULE 設置 ##
有些情況下,你可能想繞開`DJANGO_SETTINGS_MODULE` 環境變量。例如,如果你正在使用自己的模板系統,而你不想建立指向設置模塊的環境變量。
這些情況下,你可以手工配置Django 的設置。實現這點可以通過調用:
`django.conf.settings.configure(default_settings, **settings)`
例如:
```
from django.conf import settings
settings.configure(DEBUG=True)
```
可以傳遞`configure()` 給任意多的關鍵字參數,每個關鍵字參數表示一個設置及其值。每個參數的名稱應該都是大寫,與上面講到的設置名稱相同。如果某個設置沒有傳遞給`configure()` 而且在后面需要使用到它,Django 將使用其默認設置的值。
當你在一個更大的應用中使用到Django 框架的一部分,有必要以這種方式配置Django —— 而且實際上推薦這么做。
所以,當通過`settings.configure()` 配置時,Django 不會對進程的環境變量做任何修改(參見`TIME_ZONE` 文檔以了解為什么會發生)。在這些情況下,它假設你已經完全控制你的環境變量。
## 自定義默認的設置 ##
如果你想讓默認值來自其它地方而不是`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_SETTINGS_MODULE`,并訪問了一下設置,然后 調用`configure()`,Django 將引發一個`RuntimeError` 表示該設置已經有配置。有個屬性正好可以用于這個情況:
例如:
```
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
```
另外,多次調用`configure()`或者在設置已經訪問過之后調用 `configure()` 都是錯誤的。
歸結為一點:只使用`configure()` 或 `DJANGO_SETTINGS_MODULE` 中的一個。不可以兩個都用和都不用。
> 另見
>
> [設置參考](http://python.usyiyi.cn/django/ref/settings.html)
> 包含完整的核心設置和contrib 應用設置的列表。
‍
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Overview](https://docs.djangoproject.com/en/1.8/topics/settings/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架