《玩轉Django2.0》讀書筆記-Django配置信息
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
項目配置是根據實際開發需求從而對整個Web框架編寫相應配置信息。配置信息主要由項目對“setting”實現,主要配置有項目路徑,密鑰配置,域名訪問權限,App列表,配置靜態資源,配置模板文件,數據配置,中間件和緩存配置。
一.基本配置信息
一個簡單對項目必須具備對基本配置信息有:項目路徑,密鑰配置,域名訪問權限,App列表和中間件。以“MyWeb”項目為例,setting.py的基本配置如下:
""" Django settings for MyWeb project. Generated by 'django-admin startproject' using Django 2.1.4. For more information on this file, see https://docs.djangoproject.com/en/2.1/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/2.1/ref/settings/ """ import os ''' BASE_DIR: 指定項目路徑,主要通過os模塊讀取當前項目在系統的具體路徑,該代碼在創建項目時自動生成,一般情況下無需修改。 ''' BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ''' SECRET_KEY: 指定密鑰配置,是一個隨機值,在項目創建的時候自動生成,一般情況下無需修改。主要用於重要的數據的加密處理,提高系統的 安全性,避免遭到攻擊者惡意破壞。密鑰主要用戶用戶密碼,CSRF機制和繪畫 Session等數據加密。 用戶密碼: Django內置一套用戶管理系統,該系統具有用戶認證和存儲用戶信息等功能,在創建用戶的時候,該用戶密碼通過密鑰 進行加密處理,保證用戶的安全性能。 CSRF機制: 該機制主要用以表單提交,防止竊取網站的用戶信息來制造惡意請求。 會話Session: Session的信息存放在Cookies,以一串隨機的字符串表示,用於標識當前訪問網站的用戶身份,記錄相關用戶信息。 ''' SECRET_KEY = 'nstb+fm4-5oxi8e432bi!w^lty20@a6lb721&byi6^gw_b6)_f' ''' DEGUG: 指定調試模式,該值為布爾值。主要在開發調試階段應設置為True,在開發調試過程中會自動檢測代碼是否發生更改,根據檢測 結果執行是否刷新重啟系統。如果項目配置部署上線,應該將其改為False,否則會泄露系統的相關信息。 ''' DEBUG = True ''' ALLOWED_HOSTS: 設置可訪問的域名,默認值為空。當DEBUG為True並且ALLOWD_HOSTS為空時,項目只允許以localhost或者127.0.0.1在瀏覽器 上訪問。當DEBUG為False時,ALLOWED_HOSTS為必填項,否則程序無法啟動,如果想允許所有域名訪問,可設置ALLOW_HOSTS=["*"]。 ''' ALLOWED_HOSTS = [] ''' INSTALLED_APPS: 指定App列表,告訴Django有哪些App。在項目創建時已有admin,auth和session等配置信息,這些都是Django內置的應用功能。 各個功能說明如下: admin: 內置的后台管理系統。 auth: 內置的用戶認證系統。 contenttypes: 記錄項目中所有model元數據(Django的ORM框架)。 sessions: Session會話功能,用於標識當前訪問網站的用戶身份,記錄相關用戶信息。 messages: 消息提示功能。 staticfiles: 查找靜態資源路徑。 溫馨提示: 如果在項目創建了App,必須在App列表INSTALLED_APPS添加App名稱。將MyWeb項目已經創建的App添加到App列表,代碼如下: ''' INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'index', 'user', ]
二.靜態資源
靜態資源指的是網站中不會改變的文件。在一般的應用程序中,靜態資源包括CSS文件,JavaScript文件以及圖片等資源文件。
此處簡單介紹以下CSS和JavaScript文件:
CSS也稱層疊樣式表(Cascading Style Sheets),是一種用來表現HTML(標准通用標記語言的一個應用)或XML(標准通用標記語言的一個子集)等文件樣式的計算機語言。CSS不僅可以靜態地修飾網頁,還可以配合各種腳本語言動態地對網頁各元素進行格式化。
Javascript是一種直譯是腳本語言,也是一種動態類型,弱類型,基於原型的語言,內置支持類型。它的解釋器被成為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,最早是在HTML(標准通用標記語言下的一個應用)網頁上使用的,用來給HTML網頁增加動態功能。
一個項目在開發過程中肯定需要使用CSS和JavaScript文件,這些靜態文件的存放主要由配置文件setting.py設置,配置信息如下:
''' STATIC_URL: 是必須配置的屬性而且不能為空。如果沒有配置STATICFILES_DIRS,則STATIC_URL只能識別static靜態資源文件夾。 ''' STATIC_URL = '/static/' ''' STATICFILES_DIRS: 是可選的配置屬性,屬性值為列表或元組格式,每個列表(元組)元素代表一個靜態資源文件夾,這些文件夾可自行命名。 在瀏覽器上訪問項目的靜態資源時,無論項目的靜態資源文件夾是如何命名的,在瀏覽器上,靜態資源的上級目錄必須為static, 而static是STATIC_URL的默認屬性值,因為STATIC_URL也是靜態資源的起始URL。 除此之外,靜態資源配置還有STATIC_ROOT,其作用是方便在服務器上不熟項目,實現服務器和項目之間的映射。STATIC_ROOT主 要收集整個項目的靜態資源並存放在一個新的文件夾,然后由該文件夾與服務器之間的構建映射關系。STATIC_ROOT用於項目生產部署, 在項目開發過程中作用不大,關於STATIC_ROOT的配置和STATICFILES_DIRS類似。 ''' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'public_static'), os.path.join(BASE_DIR,'index/index_static') ]
三.模版路徑
在Web開發中,模板是一種較為特殊的HTML文檔。這個HTML文檔嵌入了一些能夠讓Python識別的變量和指針,然后程序解析這些變量和指令,生成的完整的HTML網頁並返回給用戶瀏覽。模板是Django里面的MTV框架模式的T部分,配置模板路徑是告訴Django在解析模板時,如何查找模板所在的位置。創建項目是,Django已經初始的模板配置信息,如下所示:
''' TEMPLATES: 模板配置是以列表格式呈現的,每個元素具有不同的含義,其含義說明如下: BACKEND: 定義模板引擎,用於識別模板里面的變量和指令。內置的模板引擎有Django Templates和jinjia2.jinja2,每個模板引擎 都有自己的變量和指令語法。 DIRS: 設置模板所在路徑,告訴Django在哪個地方查找模板的位置,默認為空列表。 模板配置通常配置DIRS路徑即可。在項目的根目錄和index下分別創建template文件夾。根目錄的templates通常存放共用 的模板文件,能夠供各個App的模板文件調用,該模式符合代碼重復使用的原則。如HTML的<head>部分。index的templates是存 放當前App所需要使用的模板文件。模板的配置如下所示。 APP_DIRS: 是否在App里查找模板文件。 OPTIONS: 用於填充在RequestContext中上下文的調用函數,一般情況下不做任何修改。 ''' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR,'index/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', ], }, }, ]
四.數據庫配置
數據庫配置是選擇項目所使用的數據庫的類型,不同的數據庫需要設置不同的數據庫引擎,數據庫引擎用於實現項目與數據的鏈接,Django提供4種數據庫引擎:'django.db.backends.postgresql','django.db.backends.mysql','django.db.backends.sqlite3'和'django.db.backends.oracle'。創建項目是默認使用Sqlite3數據庫配置信息如下:
''' DATABASES: 指定數據庫的類型,如下所示,默認是使用sqlite3。 ''' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
如果把上面的鏈接信息改為MySQL數據庫,首先安裝MySQL鏈接模塊,由於mysqldb不支持Python3,因此Django2.0不在使用mysqldb作為MySQL的鏈接模塊,而選擇了mysqlclient模塊,兩者之間在使用上並沒有太大的差異。在配置MySQL之前,首先安裝mysqlclient模塊,這里以pip安裝方法為例,打開CMD窗口並輸入安裝指令“pip install mysqlclient”,等待模塊安裝完成。然后檢測mysqlclient的版本信息,如果mysqlclient版本信息過低,就不符合Django的使用要求。在CMD窗口進入Python交互解釋器進行版本驗證,如下圖所示:
Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\Users\yinzhengjie>pip install mysqlclient Collecting mysqlclient Downloading https://files.pythonhosted.org/packages/6f/d5/fee36b78367c275d7542181bd522d7204dbfb4bc2ad2c6de72a738059a92/mysqlclient-1.3.14-cp36-cp36m-win_amd64.whl (266kB) 100% |████████████████████████████████| 276kB 57kB/s Installing collected packages: mysqlclient Successfully installed mysqlclient-1.3.14 C:\Users\yinzhengjie>

一般情況下,使用pip安裝mysqlclient模塊都能符合Django的使用要求。如果在開發過程中發現Django提示mysqlclient版本過低,而且mysqlclient的版本又大於1.3.7版本,那么可以對Django的源碼進行修改,在Python的安裝目錄下找到base文件(“C:\Users\yinzhengjie\softwares\python36\Lib\site-packages\django\db\backends\mysql\base.py”)。

完成mysqlclient模塊的安裝后,在項目的配置文件setting.py中配置MySQL數據庫鏈接信息,代碼如下:
''' DATABASES 標識指定數據庫的配置信息 ENGINE 指定數據庫的類型,此處我們指定的是mysql。 NAME 指定數據庫的名稱 USER 指定數據庫的用戶名 PASSWORD 指定數據的密碼 HOST 指定數據的主機IP地址 POST 指定數據庫的端口信息 ''' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'yinzhengjie', 'USER':'root', 'PASSWORD':'yinzhengjie', 'HOST':'172.30.1.2', 'POST': '3306', } }
上述鏈接方式用於鏈接MySQL里面一個名為“yinzhengjie”的數據庫,上述配置只是鏈接了一個“yinzhengjie”的數據庫,在日常的開發中,有時候鏈接需要多個數據庫,實現方法如下:
DATABASES = { #第一個數據庫 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, #第二個數據庫為mysql 'yinzhengjie': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'yinzhengjie', 'USER':'root', 'PASSWORD':'yinzhengjie', 'HOST':'172.30.1.2', 'POST': '3306', }, #第三個數據庫 'MyDjango': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'MyDjango_db', 'USER': 'root', 'PASSWORD': 'yinzhengjie', 'HOST': '172.30.1.2', 'POST': '3306', } }
上述代碼供鏈接了三個數據庫,分別是“yinzhengjie”,"MyDjango_db"和“db.sqlite3”。“yinzhengjie”,"MyDjango_db"均屬於MySQL數據庫系統,“db.sqlite3”屬於Sqlite3數據庫系統。從DATABASES的數據類型可以發現是一個數據字典,也就是說如果需要鏈接多個數據庫,只需要屬性DATABASES中設置不同的鍵值對即可實現。
值得注意的是,本片博客是以MySQL的5.7版本為例進行介紹的。如果讀者使用的是5.7以上的版本,在Django鏈接MySQL數據庫時會提示“django.db.utils.OperationalError”的錯誤信息,這是因為MySQL8.0版本的密碼加密方式發生了改變,8.0版本的用戶密碼采用的是cha2加密方法。為了解決這Django鏈接MySQL數據的錯誤問題。在MySQL的可視化工具中允許以下SQL語句:
ALTER USER 'root'@'172.30.1.%' IDENTIFIED WITH mysql_native_password BY 'yinzhengjie'; FLUSH PRIVILEGES;
Django除了支持PostgreSQL,Sqlite3,MySQL和Oracle之外,還支持SQLServer和MangoDB的鏈接。由於不同的數據庫有不同的鏈接方式,此處不過多介紹,本篇博客以MYSQL鏈接為例,若需了解其他數據庫的鏈接方式,可自行搜索相關資料。
五.中間件
中間件(Middleware)是處理Django的request和response對象的鈎子,當用戶在網站中進行單擊某個按鈕等操作時,這個動作是用戶向網站發送請求(request);而網頁會根據用戶的操作返回相關的網頁內容,這個過程稱為響應處理(response)。從請求到響應的過程中,當Django接受到用戶請求時,Django首先經過中間件 處理請求信息,執行相關的處理,然后將處理結果返回給用戶,中間件執行流程如下圖所示:

從上圖能清晰的看到,中間件的作用主要是處理用戶請求信息。開發者也可以根據自己的開發需求自定義中間件,只要將自定義的中間件添加到配置屬性MIDDLEWARE中即可激活。一般情況下,Django默認的中間件配置均可滿足大部分的開發需求。在項目的MINDDELEWARE中添加LocalMiddleware中間件,使得Django內置的功能支持中文顯示,代碼如下:
''' MIDDLEWARE 配置屬性MIDDLEWARE的數據格式為列表類型,每個中間件的設置順序是固定的,如果隨意變更中間件很容易導致呈現異常。 SecurityMiddleware: 內置的安全機制,保護用戶與網站的通信安全。 SessionMiddleware: 會話Session功能。 LocalMiddleware: 支持中文語言。 CommonMiddleware: 處理請求信息,規范化請求內容。 CsrfViewMiddleware: 開啟CSRF防護功能。 AuthenticationMiddleware: 開啟內置的用戶認證系統。 MessageMiddleware: 開啟內置的信息提示功能。 XFrameOptionsMiddleware: 防止惡意程序點擊劫持。 ''' MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.local.LocalMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
