《玩轉Django2.0》讀書筆記-Django配置信息


              《玩轉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>
C:\Users\yinzhengjie>pip install mysqlclient

  一般情況下,使用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',
]

 

 

 

 


免責聲明!

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



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