Django配置信息(全面)

Django的配置文件setting.py用於配置整個網站的環境和功能,核心配置必須有項目密鑰配置、域名訪問權限、App列表、中間件、資源文件、模板配置、數據庫的連接方式。

1、基本配置信息

一個簡單的項目必須具備的基本配置信息有:項目路徑、密鑰配置、域名訪問權限、App列表和中間件。
項目的settings.py的基本配置如下:

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 = '(v_fey0s$cv9v4vr70g1kksdqaufb2=ip1q7uue@b(!t6!zdnv'

# 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爲必填項,否則程序無法啓動,如果允許所有域名訪問,可設置ALLOW_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名稱。將MyDjango項目已創建的App添加到App列表,代碼如下:
      在這裏插入圖片描述

2、資源文件配置

資源文件配置分爲靜態資源媒體資源。靜態資源的配置方式由配置屬性STATIC_URL、STATICFILES_DIRS和STATIC_ROOT進行配置;媒體資源的配置方式有配置屬性MEDIA_URL和MEDIA_ROOT決定。

  • 靜態資源: 指的是網站中不會改變的文件。在一般的應用程序中,靜態資源包括CSS文件、Javascript文件以及圖片等資源文件。
  • 媒體資源: 對於一些經常變動的資源,通常將其放在媒體資源文件夾,如用戶頭像、歌曲文件等。

靜態資源和媒體資源可以同時存在,兩者可以獨立運行,互不影響。

2.1、靜態資源

2.1.1 資源路由—STATIC_URL

Django的默認配置信息如下:
在這裏插入圖片描述上述配置是設置靜態文件的路由地址,其作用是通過瀏覽器訪問Django的靜態資源。默認情況下,Django只能識別項目應用App的static文件夾裏面的靜態資源。當項目啓動時,Django會從項目應用App裏面查找相關的資源文件,查找功能主要由App列表INSTALL_APPS的staticfiles實現。在index(應用名稱)中手動創建static文件夾並在文件夾中放入靜態文件。
Django在調試模式(DEBUG=True)下只能識別項目應用App的static文件夾裏面的靜態資源,如果該文件夾改爲其他名字,Django就無法識別,若static文件夾放在MyDjango的項目目錄下,則Django也是無法識別的。也就是說,資源路由STATIC_URL的值爲/static/,則瀏覽器訪問靜態資源的網站必須爲static,否則無法訪問,並且Django在調試模式(DEBUG=True)下只能識別App目錄下的static文件夾。

2.1.2 資源集合—STATICFILES_DIRS

存在感: 解決STATIC_URL的不足。由於STATIC_URL的特殊性,在開發中會造成諸多不便,比如將靜態文件夾存放在項目的根目錄以及定義多個靜態文件夾等。
在配置文件settings.py中手動設置STATICFILES_DIRS屬性。該屬性以列列表形式表示,設置方式如下:

STATICFILES_DIRS = [
# 設置根目錄的靜態資源文件夾static
os.path.join(BASE_DIR,'static'),
#設置App(index)的靜態資源文件夾MyStatic
os.path.join(BASE_DIR,'index/Mystatic'),
]

此時項目中App應用(index)文件下的MyStatic和static以及項目根目錄下的static文件夾都可以存放靜態資源。瀏覽器訪問的時候,圖片路徑(靜態資源)皆爲http://127.0.0.1:8000/static/xxx.jpg。若將STATIC_URL的值改爲AllStatic,再次重啓項目,則在瀏覽器上圖片資源路徑的static則改爲Allstatic。

2.1.3 資源部署—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所設置的文件夾裏。

2.2、媒體資源

在項目的根目錄下手動創建media文件夾。

2.2.1、資源路由—MEDIA_URL
# 設置媒體路由地址信息
MEDIA_URL = '/media/'
2.2.2、獲取media文件夾在路徑信息—MEDIA_ROOT
# 獲取media文件夾的完整路徑信息
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

配置屬性設置後,還需要將media文件夾註冊到Django裏,讓Django知道如何找到媒體文件,否則無法在瀏覽器上訪問該文件夾的文件信息。此時需要打開MyDjango文件夾的urls.py文件,爲媒體文件夾media添加相應的路由地址,代碼如下:

from django.contrib import admin
from django.urls import path,re_path
# 導入項目應用index
from index.views import index

# 配置媒體文件夾media
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',index),
    # 配置媒體文件的路由地址
    re_path('media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT},name = 'media'),
]

3、模板配置

在Web開發中,模板是一種特殊的HTML文檔。這些HTML文檔嵌入了一些能夠識別的變量和指令,然後由Django的模板引擎解析這些變量和指令,生成完整的HTML網頁並返回給用戶瀏覽。模板Django裏面的MTV框架模式的T部分,配置模板路徑是告訴Django在解析模板時,如何找到模板所在的位置。創建項目時,Django已有初始的模板配置。如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

模板配置是以列表格式呈現的,每個元素具有不同的含義,含義說明如下:

  • BACKEND: 定義模板引擎,用於識別模板裏面的變量和指令。內置的模板引擎有Django Templates和jinja2.Jinjia2,每個模板引擎都有自己的變量和指令語法。
  • DIRS: 設置模板所在路徑,告訴Django在哪個地方找到模板的位置,默認爲空列表。
  • APP_DIRS: 是否在App裏查找模板文件。
  • OPTIONS: 用於填充在RequestContext的上下文(模板裏面的變量和指令),一般情況下不做任何修改。

模板配置通常配置DIRS的屬性值即可,在項目的根目錄和index下分別創建templates文件夾,並在文件夾下分別創建文件index.html和app_index.html。一般情況下,根目錄的templates通常存放共用的模板文件,能爲各個App的模板文件調用,這個模式符合代碼重複使用原則。則配置信息代碼如下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'index/templates'),
                 ]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

4、數據庫配置

數據庫配置是選擇項目所使用的數據類型,不同的數據庫需要設置不同的數據庫引擎,數據庫引擎實現項目於與數據庫的連接。Django提供4種數據庫引擎。

  • ‘django.db.backends.postgresql’
  • ‘django.db.backends.mysql’
  • ‘django.db.backends.sqlite3’
  • ‘django.db.backends.oracle’

項目創建時默認使用Sqlite3數據庫,這是一款輕型的數據庫,常用於嵌入式系統開發,且佔用資源非常少。Sqlite3數據庫配置信息如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

4.1、 mysqlclient連接MySql

由於mysqldb不支持Python3,因此Django2.0以上版本不再使用mysqldb作爲MySql的連接模塊,而選擇mysqlclient模塊,但兩者之間在使用上並沒有太大的差異。
在配置MySQL之前,需要安裝mysqlclient模塊。使用pip install mysqlclient即可。
項目的配置文件setting.py中配置MySQL數據庫連接信息,代碼如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'127.0.0.1',
        'PORT':'3306'
    }
}

爲了驗證數據庫連接信息是否正確,在PyCharm的Terminal界面下輸入Django操作指令python manage.py migrate來創建Django內置功能的數據表,能到自己建立的數據庫中查找到這些數據表,則表示數據庫連接正確!

4.2、pymysql連接MySQL

除了使用mysqlclient模塊連接MySQL之外,還可以使用pymysql模塊連接MySQL數據庫。pymysql模塊安裝使用pip在線安裝即可,pymysql模塊安裝成功後,項目配置文件settings.py的數據庫配置信息無需修改,只要在MyDjango文件夾__init__.py中設置數據庫連接模塊即可,代碼如下:

import pymysql
pymysql.install_as_MySQLdb()

驗證的方法與mysqlclient連接MySql一樣。值得注意的是,若MySQL是8.0以上版本,在Django連接MySQL數據庫時會提示django.db.utils.OperationalError的錯誤信息,這是因爲MySQL8.0版本的密碼加密方式發生了改變,8.0版本的用戶密碼採用的是CHA2加密方式。爲了解決這個問題,通過SQL語句將8.0的加密方式改回原來的加密方式,在MySQL的可視化工具中運行以下SQL語句:

# newpassword 是已設置的用戶密碼
ALERT USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
FLUSH PRIVILEGES;

Django除了支持PostgreSQL、SQLite3、MySQL和Oracle之外,還支持SQL Server和MongoDB的連接。

4.3 多個數據庫的連接方式

在一個項目中可能需要使用多個數據庫才能滿足開發需求,特別對於數據量過大的系統,單個數據庫存儲的數據越多就會使服務器負載越大,因此會將數據劃分多個數據庫服務器共同存儲。

#數據庫配置
DATABASES = {
   'default': {
          'ENGINE': 'django.db.backends.mysql', #數據庫引擎
          'NAME': 'pythondms',                       #數據庫名
          'USER': 'root',                       #用戶名
          'PASSWORD': '',                   #密碼
          'HOST': '36.103.245.29',                           #數據庫主機,默認爲localhost
          'PORT': '3306',                           #數據庫端口,MySQL默認爲3306
          'OPTIONS': {
             'autocommit': True,
         }
    },
    'default1': {
          'ENGINE': 'django.db.backends.mysql', #數據庫引擎
          'NAME': 'pythondms',                       #數據庫名
          'USER': 'root',                       #用戶名
          'PASSWORD': '',                   #密碼
          'HOST': '39.107.35.95',                           #數據庫主機,默認爲localhost
          'PORT': '3306',                           #數據庫端口,MySQL默認爲3306
          'OPTIONS': {
             'autocommit': True,
         }
    }
}

項目中連接了多個數據庫,則數據庫之間的使用需要遵從一定的規則和設置。比如項目中定義了多個模型,每個模型所對應的數據表可以選擇在某個數據庫中生成,如果模型沒有指向某個數據庫,模型就會在key爲default的數據庫中生成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章