Django(5)django配置資訊

Silent丿丶黑羽發表於2021-05-12

前言

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為空列表時,專案只允許以localhost127.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_URLSTATICFILES_DIRSSTATIC_ROOT進行設定;媒體資源的配置方式由配置屬性MEDIA_URLMEDIA_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_URLMEDIA_ROOT
在配置檔案settings.py裡設定配置屬性MEDIA_URLMEDIA_ROOTMEDIA_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
       

內建中介軟體放置的順序

  1. SecurityMiddleware:應該放到最前面。因為這個中介軟體並不需要依賴任何其他的中介軟體。如果你的網站同時支援http協議和https協議,並且你想讓使用者在使用http協議的時候重定向到https協議,那麼就沒有必要讓他執行下面一大串中介軟體再重定向,這樣效率更高。
  2. UpdateCacheMiddleware:應該在SessionMiddleware, GZipMiddleware, LocaleMiddleware之前。
  3. GZipMiddleware。
  4. ConditionalGetMiddleware。
  5. SessionMiddleware。
  6. LocaleMiddleware。
  7. CommonMiddleware。
  8. CsrfViewMiddleware。
  9. AuthenticationMiddleware。
  10. MessageMiddleware。
  11. FetchFromCacheMiddleware。
  12. FlatpageFallbackMiddleware。
  13. RedirectFallbackMiddleware。

相關文章