Django(5)django配置信息(最詳細介紹)


前言

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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM