前言
Django的配置檔案settings.py
用於配置整個網站的環境和功能,核心配置必須有專案路徑、金鑰配置、域名訪問許可權、App列表、中介軟體、資原始檔、模板配置、資料庫的連線方式
基本配置資訊
import os
# 專案路徑
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# 金鑰配置
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '&syojot)=!^m&neg)@_*t^tabsl#dg&p5*!m-1yhl97e#7*3di'
# 除錯模式
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 域名訪問許可權
ALLOWED_HOSTS = []
#App列表
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
專案路徑
BASE_DIR:主要通過os模組讀取當前專案在計算機系統的具體路徑,該程式碼在建立專案時自動生成,一般情況下無須修改。
金鑰配置
SECRET_KEY:這是一個隨機值,在建立專案的時候自動生成,一般情況下無須修改。主要用於重要資料的加密處理,提高專案的安全性,避免遭到攻擊者惡意破壞。金鑰主要用於使用者密碼、CSRF機制
和會話Session
等資料加密
- 使用者密碼:Django內建一套Auth認證系統,該系統具有使用者認證和儲存使用者資訊等功能,在建立使用者的時候,將使用者密碼通過金鑰進行加密處理,保證使用者的安全性
- CSRF機制:該機制主要用於表單提交,防止竊取網站的使用者資訊來製造惡意請求
- 會話Session:Session的資訊存放在Cookie中,以一串隨機的字串表示,用於標識當前訪問網站的使用者身份,記錄相關使用者資訊
除錯模式
DEBUG:該值為布林型別。如果在開發除錯階段,那麼應設定為True
,在開發除錯過程中會自動檢測程式碼是否發生更改,根據監測結果執行是否重新整理重啟系統。如果專案部署上線,那麼應改為False
,否則會洩漏專案的相關資訊
域名訪問許可權
ALLOWED_HOSTS:設定可訪問的域名,預設值為空列表。當DEBUG為True並且ALLOWED_HOSTS
為空列表時,專案只允許以localhost
或127.0.0.1
在瀏覽器上訪問。當DEBUG
為False時,ALLOWED_HOSTS
為必填項,否則程式無法啟動,如果想允許所有域名訪問,可設定ALLOWED_HOSTS=['*']
App列表
INSTALLED_APPS:告訴Django有哪些App。在專案建立時已有admin、auth和sessions等配置資訊,這些都是Django內建的應用功能,各個功能說明如下
- admin:內建的後臺管理系統
- auth:內建的使用者認證系統
- contenttypes:記錄專案中所有model後設資料(Django的ORM框架)
- sessions:Session會話功能,用於標識當前訪問網站的使用者身份,記錄相關使用者資訊
- messages:訊息提示功能
- staticfiles:查詢靜態資源路徑
如果在專案中建立了App,就必須在App列表INSTALLED_APPS
新增App名稱。程式碼如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls' # 新建立的app
]
資原始檔配置
資原始檔配置分為靜態資源和媒體資源。靜態資源的配置方式由配置屬性STATIC_URL
、STATICFILES_DIRS
和STATIC_ROOT
進行設定;媒體資源的配置方式由配置屬性MEDIA_URL
和MEDIA_ROOT
決定
資源路由--STATIC_URL
靜態資源指的是網站中不會改變的檔案,例如css檔案、JavaScript檔案以及圖片等資原始檔,這些靜態檔案的存放主要由配置檔案settings.py
設定,Django預設配置如下:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
上述配置是設定靜態資源的路由地址,其作用是通過瀏覽器訪問django的靜態資源。預設情況下,Django只能識別專案應用App的static資料夾裡面的靜態資源。當專案啟動時,Django會從專案應用app裡面查詢相關的資原始檔,查詢功能主要由App列表INSTALLED_APPS
的staticfiles實現
注意:一般我們會在app下面建立一個static
資料夾,然後在static
檔案下再建立一個app的名字,再把靜態檔案放到這個資料夾下,例如你的app叫做polls
,有一個靜態檔案叫做dog.jpg
,那麼路徑為/static/polls/dog.jpg
(為什麼在app下建立一個static資料夾,還需要在這個static下建立一個同app名字的資料夾呢?原因是如果直接把靜態檔案放在static資料夾下,那麼在模版載入靜態檔案的時候就是使用dog.jpg,如果在多個app之間有同名的靜態檔案,這時候可能就會產生混淆。而在static資料夾下加了一個同名app資料夾,在模版中載入的時候就是使用app/dog.jpg,這樣就可以避免產生混淆。)
資源集合--STATICFILES_DIRS
如果有一些靜態檔案是和app沒有任何關係的。那麼可以在settings.py
中新增STATICFILES_DIRS
,以後DTL就會在這個列表的路徑中查詢靜態檔案。比如可以設定為:
# 設定根目錄的靜態資原始檔夾static
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
這樣我們就可以在瀏覽器中訪問根目錄的static,static資料夾中可以存放一些與app無關的靜態檔案。
資源部署--STATIC_ROOT
靜態資源配置還有STATIC_ROOT
,其作用是在伺服器上部署專案,實現伺服器和專案之間的對映。STATIC_ROOT
主要收集整個專案的靜態資源並存放在一個新的資料夾,然後由該資料夾與伺服器之間構建對映關係。STATIC_ROOT
配置如下:
# 設定資源部署資料夾
STATIC_ROOT = [os.path.join(BASE_DIR, 'AllStatic')]
當專案的配置屬性DEBUG為True時,Django會自動提供靜態檔案代理服務,此時整個專案處於開發階段,因此無需使用STATIC_ROOT
。當配置屬性DEBUG為False時,意味著專案進入生產環境,Django不再提供靜態檔案代理服務,此時需要在專案的配置檔案中設定STATIC_ROOT
。
設定STATIC_ROOT
需要使用Django操作指令collectstatic
來收集所有靜態資源,這些靜態資源都會儲存在STATIC_ROOT
所設定的資料夾裡。
媒體資源--MEDIA
一般情況下,STATIC_URL
是設定靜態資原始檔的路由地址,如CSS樣式檔案、JavaScript以及常用圖片等。對於一些經常變動的資源,通常將其存放在媒體資原始檔夾,如使用者頭像、歌曲檔案等。
媒體資源和靜態資源是可以同時存在的,而且兩者可以獨立執行,互不影響,而媒體資源只有配置屬性MEDIA_URL
和MEDIA_ROOT
。
在配置檔案settings.py
裡設定配置屬性MEDIA_URL
和MEDIA_ROOT
,MEDIA_URL
用於設定媒體資源的路由地址,MEDIA_ROOT
用於獲取media資料夾在計算機系統的完整路徑資訊,如下所示:
# 設定媒體路由地址
MEDIA_URL = '/media/'
# 獲取media資料夾的完整路徑
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
配置屬性設定後,還需要將media資料夾註冊到django中,讓django知道如何找到媒體檔案,否則無法在瀏覽器上訪問該資料夾的檔案資訊。我們為媒體資料夾media新增相應的路由地址
from django.conf import settings
from django.urls import path, re_path
from django.views.static import serve
urlpatterns = [
re_path('media/(?P<path>.*)', serve,
{'document_root': settings.MEDIA_ROOT}, name="media")
]
此時,我們就可以通過瀏覽器訪問media資料夾下的資源了
模板配置資訊
使用前後端分離框架,這裡暫不描述
資料庫配置
待更新
中介軟體配置
中介軟體(Middleware)是一個用來處理Django的請求(Request)和響應(Response)的框架級別的鉤子,它是一個輕量、低階別的外掛系統,用於在全域性範圍內改變Django的輸入和輸出。
當使用者在網站中進行某個操作時,這個過程是使用者向網站傳送HTTP請求(Request);而網站會根據使用者的操作發返回相關的網頁內容,這個過程稱為響應處理(Response)。從請求到響應的過程中,當Django接收到使用者請求時,首先經過中介軟體處理請求資訊,執行相關的處理,然後將處理結果返回給使用者。
從上圖中可清晰的看到,中介軟體的作用是處理使用者請求資訊和返回響應內容。開發者可以根據自己的開發需求自定義中介軟體,只要將自定義的中介軟體新增到配置屬性MIDDLEWARE
中即可啟用
一般情況下,Django預設的中介軟體配置均可滿足大部分開發需求,我們在專案中MIDDLEWARE
中新增LocalMiddleware
中介軟體,使得Django內建的功能支援中文顯示,程式碼如下:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 新增中介軟體
'django.middleware.locale.LocaleMiddleware'
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Django內建中介軟體
配置屬性MIDDLEWARE
的資料格式為列表型別,每個中介軟體的設定順序是固定的,如果隨意變更中介軟體,就很容易導致程式異常。每個中介軟體的說明如下:
-
SecurityMiddleware:內建的安全機制,做了一些安全處。比如設定XSS防禦的請求頭,比如做了http協議轉https協議的工作等
-
SessionMiddleware:session中介軟體。會給request新增一個處理好的session物件。
-
LocaleMiddleware:國際化和本地化功能
-
CommonMiddleware:通用中介軟體作用如下
- 限制
settings.DISALLOWED_USER_AGENTS
中指定的請求頭來訪問本網站。DISALLOWED_USER_AGENT
是一個正規表示式的列表。示例程式碼如下:
import re DISALLOWED_USER_AGENTS = [ re.compile(r'^\s$|^$'), re.compile(r'.*PhantomJS.*') ]
- 如果開發者在定義url的時候,最後有一個斜槓。但是使用者在訪問url的時候沒有提交這個斜槓,那麼
CommonMiddleware
會自動的重定向到加了斜槓的url上去。
- 限制
-
CsrfViewMiddleware:開啟CSRF保護功能
-
AuthenticationMiddleware:會給request新增一個
user
物件的中介軟體。 -
MessageMiddleware:開啟內建的資訊提示功能
-
XFrameOptionsMiddleware:做了
clickjacking
攻擊的保護。clickjacking
保護是攻擊者在自己的病毒網站上,寫一個誘惑使用者點選的按鈕,然後使用iframe的方式將受攻擊的網站(比如銀行網站)載入到自己的網站上去,並將其設定為透明的,使用者就看不到,然後再把受攻擊的網站(比如銀行網站)的轉賬按鈕定位到病毒網站的按鈕上,這樣使用者在點選病毒網站上按鈕的時候,實際上點選的是受攻擊的網站(比如銀行網站)上的按鈕,從而實現了在不知不覺中給攻擊者轉賬的功能。 -
django.middleware.gzip.GZipMiddleware:將響應資料進行壓縮。如果內容長度少於200個長度,那麼就不會壓縮。
-
快取中介軟體:用來快取一些頁面的
django.middleware.cache.UpdateCacheMiddleware
django.middleware.cache.FetchFromCacheMiddleware
內建中介軟體放置的順序
- SecurityMiddleware:應該放到最前面。因為這個中介軟體並不需要依賴任何其他的中介軟體。如果你的網站同時支援
http
協議和https
協議,並且你想讓使用者在使用http協議的時候重定向到https協議,那麼就沒有必要讓他執行下面一大串中介軟體再重定向,這樣效率更高。 - UpdateCacheMiddleware:應該在SessionMiddleware, GZipMiddleware, LocaleMiddleware之前。
- GZipMiddleware。
- ConditionalGetMiddleware。
- SessionMiddleware。
- LocaleMiddleware。
- CommonMiddleware。
- CsrfViewMiddleware。
- AuthenticationMiddleware。
- MessageMiddleware。
- FetchFromCacheMiddleware。
- FlatpageFallbackMiddleware。
- RedirectFallbackMiddleware。