《玩轉Django2.0》讀書筆記-Django配置信息python
做者:尹正傑 mysql
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。sql
項目配置是根據實際開發需求從而對整個Web框架編寫相應配置信息。配置信息主要由項目對「setting」實現,主要配置有項目路徑,密鑰配置,域名訪問權限,App列表,配置靜態資源,配置模板文件,數據配置,中間件和緩存配置。數據庫
一.基本配置信息django
一個簡單對項目必須具有對基本配置信息有:項目路徑,密鑰配置,域名訪問權限,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') ]
三.模版路徑session
在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', ]