前言
Django的配置檔案<code>settings.py</code>用于配置整個網站的環境和功能,核心配置必須有項目路徑、密鑰配置、域名通路權限、App清單、中間件、資源檔案、模闆配置、資料庫的連接配接方式
基本配置資訊
BASE_DIR:主要通過os子產品讀取目前項目在計算機系統的具體路徑,該代碼在建立項目時自動生成,一般情況下無須修改。
SECRET_KEY:這是一個随機值,在建立項目的時候自動生成,一般情況下無須修改。主要用于重要資料的加密處理,提高項目的安全性,避免遭到攻擊者惡意破壞。密鑰主要用于使用者密碼、<code>CSRF機制</code>和<code>會話Session</code>等資料加密
使用者密碼:Django内置一套Auth認證系統,該系統具有使用者認證和存儲使用者資訊等功能,在建立使用者的時候,将使用者密碼通過密鑰進行加密處理,保證使用者的安全性
CSRF機制:該機制主要用于表單送出,防止竊取網站的使用者資訊來制造惡意請求
會話Session:Session的資訊存放在Cookie中,以一串随機的字元串表示,用于辨別目前通路網站的使用者身份,記錄相關使用者資訊
DEBUG:該值為布爾類型。如果在開發調試階段,那麼應設定為<code>True</code>,在開發調試過程中會自動檢測代碼是否發生更改,根據監測結果執行是否重新整理重新開機系統。如果項目部署上線,那麼應改為<code>False</code>,否則會洩漏項目的相關資訊
ALLOWED_HOSTS:設定可通路的域名,預設值為空清單。當DEBUG為True并且<code>ALLOWED_HOSTS</code>為空清單時,項目隻允許以<code>localhost</code>或<code>127.0.0.1</code>在浏覽器上通路。當<code>DEBUG</code>為False時,<code>ALLOWED_HOSTS</code>為必填項,否則程式無法啟動,如果想允許所有域名通路,可設定<code>ALLOWED_HOSTS=['*']</code>
INSTALLED_APPS:告訴Django有哪些App。在項目建立時已有admin、auth和sessions等配置資訊,這些都是Django内置的應用功能,各個功能說明如下
admin:内置的背景管理系統
auth:内置的使用者認證系統
contenttypes:記錄項目中所有model中繼資料(Django的ORM架構)
sessions:Session會話功能,用于辨別目前通路網站的使用者身份,記錄相關使用者資訊
messages:消息提示功能
staticfiles:查找靜态資源路徑
如果在項目中建立了App,就必須在App清單<code>INSTALLED_APPS</code>添加App名稱。代碼如下:
資源檔案配置
資源檔案配置分為靜态資源和媒體資源。靜态資源的配置方式由配置屬性<code>STATIC_URL</code>、<code>STATICFILES_DIRS</code>和<code>STATIC_ROOT</code>進行設定;媒體資源的配置方式由配置屬性<code>MEDIA_URL</code>和<code>MEDIA_ROOT</code>決定
靜态資源指的是網站中不會改變的檔案,例如css檔案、JavaScript檔案以及圖檔等資源檔案,這些靜态檔案的存放主要由配置檔案<code>settings.py</code>設定,Django預設配置如下:
上述配置是設定靜态資源的路由位址,其作用是通過浏覽器通路django的靜态資源。預設情況下,Django隻能識别項目應用App的static檔案夾裡面的靜态資源。當項目啟動時,Django會從項目應用app裡面查找相關的資源檔案,查找功能主要由App清單<code>INSTALLED_APPS</code>的staticfiles實作
注意:一般我們會在app下面建立一個<code>static</code>檔案夾,然後在<code>static</code>檔案下再建立一個app的名字,再把靜态檔案放到這個檔案夾下,例如你的app叫做<code>polls</code>,有一個靜态檔案叫做<code>dog.jpg</code>,那麼路徑為<code>/static/polls/dog.jpg</code>(為什麼在app下建立一個static檔案夾,還需要在這個static下建立一個同app名字的檔案夾呢?原因是如果直接把靜态檔案放在static檔案夾下,那麼在模版加載靜态檔案的時候就是使用dog.jpg,如果在多個app之間有同名的靜态檔案,這時候可能就會産生混淆。而在static檔案夾下加了一個同名app檔案夾,在模版中加載的時候就是使用app/dog.jpg,這樣就可以避免産生混淆。)
如果有一些靜态檔案是和app沒有任何關系的。那麼可以在<code>settings.py</code>中添加<code>STATICFILES_DIRS</code>,以後DTL就會在這個清單的路徑中查找靜态檔案。比如可以設定為:
這樣我們就可以在浏覽器中通路根目錄的static,static檔案夾中可以存放一些與app無關的靜态檔案。
靜态資源配置還有<code>STATIC_ROOT</code>,其作用是在伺服器上部署項目,實作伺服器和項目之間的映射。<code>STATIC_ROOT</code>主要收集整個項目的靜态資源并存放在一個新的檔案夾,然後由該檔案夾與伺服器之間建構映射關系。<code>STATIC_ROOT</code>配置如下:
當項目的配置屬性DEBUG為True時,Django會自動提供靜态檔案代理服務,此時整個項目處于開發階段,是以無需使用<code>STATIC_ROOT</code>。當配置屬性DEBUG為False時,意味着項目進入生産環境,Django不再提供靜态檔案代理服務,此時需要在項目的配置檔案中設定<code>STATIC_ROOT</code>。
設定<code>STATIC_ROOT</code>需要使用Django操作指令<code>collectstatic</code>來收集所有靜态資源,這些靜态資源都會儲存在<code>STATIC_ROOT</code>所設定的檔案夾裡。
一般情況下,<code>STATIC_URL</code>是設定靜态資源檔案的路由位址,如CSS樣式檔案、JavaScript以及常用圖檔等。對于一些經常變動的資源,通常将其存放在媒體資源檔案夾,如使用者頭像、歌曲檔案等。
媒體資源和靜态資源是可以同時存在的,而且兩者可以獨立運作,互不影響,而媒體資源隻有配置屬性<code>MEDIA_URL</code>和<code>MEDIA_ROOT</code>。
在配置檔案<code>settings.py</code>裡設定配置屬性<code>MEDIA_URL</code>和<code>MEDIA_ROOT</code>,<code>MEDIA_URL</code>用于設定媒體資源的路由位址,<code>MEDIA_ROOT</code>用于擷取media檔案夾在計算機系統的完整路徑資訊,如下所示:
配置屬性設定後,還需要将media檔案夾注冊到django中,讓django知道如何找到媒體檔案,否則無法在浏覽器上通路該檔案夾的檔案資訊。我們為媒體檔案夾media添加相應的路由位址
此時,我們就可以通過浏覽器通路media檔案夾下的資源了
模闆配置資訊
使用前後端分離架構,這裡暫不描述
資料庫配置
待更新
中間件配置
中間件(Middleware)是一個用來處理Django的請求(Request)和響應(Response)的架構級别的鈎子,它是一個輕量、低級别的插件系統,用于在全局範圍内改變Django的輸入和輸出。
當使用者在網站中進行某個操作時,這個過程是使用者向網站發送HTTP請求(Request);而網站會根據使用者的操作發傳回相關的網頁内容,這個過程稱為響應處理(Response)。從請求到響應的過程中,當Django接收到使用者請求時,首先經過中間件處理請求資訊,執行相關的處理,然後将處理結果傳回給使用者。

從上圖中可清晰的看到,中間件的作用是處理使用者請求資訊和傳回響應内容。開發者可以根據自己的開發需求自定義中間件,隻要将自定義的中間件添加到配置屬性<code>MIDDLEWARE</code>中即可激活
一般情況下,Django預設的中間件配置均可滿足大部分開發需求,我們在項目中<code>MIDDLEWARE</code>中添加<code>LocalMiddleware</code>中間件,使得Django内置的功能支援中文顯示,代碼如下:
配置屬性<code>MIDDLEWARE</code>的資料格式為清單類型,每個中間件的設定順序是固定的,如果随意變更中間件,就很容易導緻程式異常。每個中間件的說明如下:
SecurityMiddleware:内置的安全機制,做了一些安全處。比如設定XSS防禦的請求頭,比如做了http協定轉https協定的工作等
SessionMiddleware:session中間件。會給request添加一個處理好的session對象。
LocaleMiddleware:國際化和本地化功能
CommonMiddleware:通用中間件作用如下
限制<code>settings.DISALLOWED_USER_AGENTS</code>中指定的請求頭來通路本網站。<code>DISALLOWED_USER_AGENT</code>是一個正規表達式的清單。示例代碼如下:
如果開發者在定義url的時候,最後有一個斜杠。但是使用者在通路url的時候沒有送出這個斜杠,那麼<code>CommonMiddleware</code>會自動的重定向到加了斜杠的url上去。
CsrfViewMiddleware:開啟CSRF保護功能
AuthenticationMiddleware:會給request添加一個<code>user</code>對象的中間件。
MessageMiddleware:開啟内置的資訊提示功能
XFrameOptionsMiddleware:做了<code>clickjacking</code>攻擊的保護。<code>clickjacking</code>保護是攻擊者在自己的病毒網站上,寫一個誘惑使用者點選的按鈕,然後使用iframe的方式将受攻擊的網站(比如銀行網站)加載到自己的網站上去,并将其設定為透明的,使用者就看不到,然後再把受攻擊的網站(比如銀行網站)的轉賬按鈕定位到病毒網站的按鈕上,這樣使用者在點選病毒網站上按鈕的時候,實際上點選的是受攻擊的網站(比如銀行網站)上的按鈕,進而實作了在不知不覺中給攻擊者轉賬的功能。
django.middleware.gzip.GZipMiddleware:将響應資料進行壓縮。如果内容長度少于200個長度,那麼就不會壓縮。
緩存中間件:用來緩存一些頁面的
<code>django.middleware.cache.UpdateCacheMiddleware</code>
<code>django.middleware.cache.FetchFromCacheMiddleware</code>
SecurityMiddleware:應該放到最前面。因為這個中間件并不需要依賴任何其他的中間件。如果你的網站同時支援<code>http</code>協定和<code>https</code>協定,并且你想讓使用者在使用http協定的時候重定向到https協定,那麼就沒有必要讓他執行下面一大串中間件再重定向,這樣效率更高。
UpdateCacheMiddleware:應該在SessionMiddleware, GZipMiddleware, LocaleMiddleware之前。
GZipMiddleware。
ConditionalGetMiddleware。
SessionMiddleware。
LocaleMiddleware。
CommonMiddleware。
CsrfViewMiddleware。
AuthenticationMiddleware。
MessageMiddleware。
FetchFromCacheMiddleware。
FlatpageFallbackMiddleware。
RedirectFallbackMiddleware。