前言
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。