一、Django介紹
1.簡介
Django当悔,發(fā)音為[`d???ɡ??]澡罚,是用python語言寫的開源web開發(fā)框架倍权,并遵循MVC設(shè)計(jì)。勞倫斯出版集團(tuán)為了開發(fā)以新聞內(nèi)容為主的網(wǎng)站挑格,而開發(fā)出來了這個(gè)框架破讨,于2005年7月在BSD許可證下發(fā)布。這個(gè)名稱來源于比利時(shí)的爵士音樂家DjangoReinhardt,他是一個(gè)吉普賽人,主要以演奏吉它為主害捕,還演奏過小提琴等莲蜘。由于Django在近年來的迅速發(fā)展唯咬,應(yīng)用越來越廣泛沐兵,被著名IT開發(fā)雜志SDTimes評選為2013SDTimes100胳泉,位列"API、庫和框架"分類第6位壁酬,被認(rèn)為是該領(lǐng)域的佼佼者。
Django的主要目的是簡便怠硼、快速的開發(fā)數(shù)據(jù)庫驅(qū)動(dòng)的網(wǎng)站涡上。它強(qiáng)調(diào)代碼復(fù)用趾断,多個(gè)組件可以很方便的以"插件"形式服務(wù)于整個(gè)框架,Django有許多功能強(qiáng)大的第三方插件吩愧,你甚至可以很方便的開發(fā)出自己的工具包。這使得Django具有很強(qiáng)的可擴(kuò)展性增显。它還強(qiáng)調(diào)快速開發(fā)和DRY(DoNotRepeatYourself)原則雁佳。
2.特點(diǎn)
1)重量級框架
對比Flask框架,Django原生提供了眾多的功能組件同云,讓開發(fā)更簡便快速糖权。
- 提供項(xiàng)目工程管理的自動(dòng)化腳本工具
- 數(shù)據(jù)庫ORM支持(對象關(guān)系映射,英語:Object Relational Mapping)
- 模板
- 表單
- Admin管理站點(diǎn)
- 文件管理
- 認(rèn)證權(quán)限
- session機(jī)制
- 緩存
2)MVT模式
有一種程序設(shè)計(jì)模式叫MVC炸站,其核心思想是分工星澳、解耦,讓不同的代碼塊之間降低耦合旱易,增強(qiáng)代碼的可擴(kuò)展性和可移植性禁偎,實(shí)現(xiàn)向后兼容。
MVC模式說明
- M全拼為Model阀坏,主要封裝對數(shù)據(jù)庫層的訪問如暖,對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增、刪忌堂、改盒至、查操作。
- V全拼為View士修,用于封裝結(jié)果枷遂,生成頁面展示的html內(nèi)容。
- C全拼為Controller棋嘲,用于接收請求酒唉,處理業(yè)務(wù)邏輯,與Model和View交互封字,返回結(jié)果黔州。
Django的MVT
- M全拼為Model,與MVC中的M功能相同阔籽,負(fù)責(zé)和數(shù)據(jù)庫交互流妻,進(jìn)行數(shù)據(jù)處理。
- V全拼為View笆制,與MVC中的C功能相同绅这,接收請求,進(jìn)行業(yè)務(wù)處理在辆,返回應(yīng)答证薇。
- T全拼為Template度苔,與MVC中的V功能相同,負(fù)責(zé)封裝構(gòu)造要返回的html浑度。
注:差異就在于黑線黑箭頭標(biāo)識出來的部分
Django學(xué)習(xí)資料
二寇窑、環(huán)境安裝
1. 創(chuàng)建虛擬環(huán)境
mkvirtualenv django_py3_1.11 -p python3
注意需要聯(lián)網(wǎng)
2. 安裝Django
使用django 1.11.11版本,注意需要聯(lián)網(wǎng)
pip install django==1.11.11
3. 常用虛擬環(huán)境和pip命令
# 虛擬環(huán)境
mkvirtualenv # 創(chuàng)建虛擬環(huán)境
rmvirtualenv # 刪除虛擬環(huán)境
workon # 進(jìn)入虛擬環(huán)境箩张、查看所有虛擬環(huán)境
deactivate # 退出虛擬環(huán)境
# pip
pip install # 安裝依賴包
pip uninstall # 卸載依賴包
pip list # 查看已安裝的依賴包
pip freeze # 凍結(jié)當(dāng)前環(huán)境的依賴包
三甩骏、創(chuàng)建Django項(xiàng)目
步驟
- 創(chuàng)建Django項(xiàng)目
- django-admin startproject name
- 創(chuàng)建子應(yīng)用
- python manager.py startapp name
創(chuàng)建工程
在使用Flask框架時(shí),項(xiàng)目工程目錄的組織與創(chuàng)建是需要我們自己手動(dòng)創(chuàng)建完成的先慷。
在django中饮笛,項(xiàng)目工程目錄可以借助django提供的命令幫助我們創(chuàng)建。
1. 創(chuàng)建
創(chuàng)建工程的命令為:
django-admin startproject 工程名稱
例如:想要在桌面的code目錄中創(chuàng)建一個(gè)名為demo的項(xiàng)目工程论熙,可執(zhí)行如下命令:
cd ~/Desktop/Code
django-admin startproject bookmanager
執(zhí)行后福青,會(huì)多出一個(gè)新目錄名為bookmanager,此即為新創(chuàng)建的工程目錄脓诡。
2. 工程目錄說明
查看創(chuàng)建的工程目錄无午,結(jié)構(gòu)如下:
- 與項(xiàng)目同名的目錄,此處為bookmanager誉券。
- settings.py是項(xiàng)目的整體配置文件指厌。
- urls.py是項(xiàng)目的URL配置文件。
- wsgi.py是項(xiàng)目與WSGI兼容的Web服務(wù)器入口踊跟。
- manage.py是項(xiàng)目管理文件踩验,通過它管理項(xiàng)目。
3. 運(yùn)行開發(fā)服務(wù)器
在開發(fā)階段商玫,為了能夠快速預(yù)覽到開發(fā)的效果箕憾,django提供了一個(gè)純python編寫的輕量級web服務(wù)器,僅在開發(fā)階段使用拳昌。
運(yùn)行服務(wù)器命令如下:
python manage.py runserver ip:端口
或:
python manage.py runserver
可以不寫IP和端口袭异,默認(rèn)IP是127.0.0.1,默認(rèn)端口為8000炬藤。
啟動(dòng)后可見如下信息:
在瀏覽器中輸入網(wǎng)址“127.0.0.1:8000”便可看到效果:
- django默認(rèn)工作在調(diào)式Debug模式下御铃,如果增加、修改沈矿、刪除文件上真,服務(wù)器會(huì)自動(dòng)重啟。
- 按ctrl+c停止服務(wù)器羹膳。
創(chuàng)建子應(yīng)用
在Web應(yīng)用中睡互,通常有一些業(yè)務(wù)功能模塊是在不同的項(xiàng)目中都可以復(fù)用的,故在開發(fā)中通常將工程項(xiàng)目拆分為不同的子功能模塊,各功能模塊間可以保持相對的獨(dú)立就珠,在其他工程項(xiàng)目中需要用到某個(gè)特定功能模塊時(shí)寇壳,可以將該模塊代碼整體復(fù)制過去,達(dá)到復(fù)用妻怎。
在Flask框架中也有類似子功能應(yīng)用模塊的概念壳炎,即藍(lán)圖Blueprint。
Django的視圖編寫是放在子應(yīng)用中的逼侦。
1. 創(chuàng)建
在django中冕广,創(chuàng)建子應(yīng)用模塊目錄仍然可以通過命令來操作,即:
python manage.py startapp 子應(yīng)用名稱
manage.py為上述創(chuàng)建工程時(shí)自動(dòng)生成的管理文件偿洁。
例如肪康,在剛才創(chuàng)建的bookmanager工程中剪芍,想要?jiǎng)?chuàng)建一個(gè)用戶book子應(yīng)用模塊,可執(zhí)行:
cd ~/Desktop/code/book
python manage.py startapp book
執(zhí)行后疗垛,可以看到工程目錄中多出了一個(gè)名為book的子目錄挠阁。
2. 子應(yīng)用目錄說明
查看此時(shí)的工程目錄宾肺,結(jié)構(gòu)如下:
- admin.py文件跟網(wǎng)站的后臺(tái)管理站點(diǎn)配置相關(guān)。
- apps.py文件用于配置當(dāng)前子應(yīng)用的相關(guān)信息侵俗。
- migrations目錄用于存放數(shù)據(jù)庫遷移歷史文件锨用。
- models.py文件用戶保存數(shù)據(jù)庫模型類。
- tests.py文件用于開發(fā)測試用例隘谣,編寫單元測試增拥。
- views.py文件用于編寫Web應(yīng)用視圖。
3. 注冊安裝子應(yīng)用
創(chuàng)建出來的子應(yīng)用目錄文件雖然被放到了工程項(xiàng)目目錄中寻歧,但是django工程并不能立即直接使用該子應(yīng)用掌栅,需要注冊安裝后才能使用。
在工程配置文件settings.py中码泛,INSTALLED_APPS項(xiàng)保存了工程中已經(jīng)注冊安裝的子應(yīng)用猾封,初始工程中的INSTALLED_APPS如下:
注冊安裝一個(gè)子應(yīng)用的方法,即是將子應(yīng)用的配置信息文件apps.py中的Config類添加到INSTALLED_APPS列表中噪珊。
例如晌缘,將剛創(chuàng)建的book子應(yīng)用添加到工程中,可在INSTALLED_APPS列表中添加'book.apps.BookConfig'痢站。
四磷箕、模型
- 當(dāng)前項(xiàng)目的開發(fā), 都是數(shù)據(jù)驅(qū)動(dòng)的。
-
以下為書籍信息管理的數(shù)據(jù)關(guān)系:書籍和人物是 :一對多關(guān)系
image - 要先分析出項(xiàng)目中所需要的數(shù)據(jù), 然后設(shè)計(jì)數(shù)據(jù)庫表.
使用Django進(jìn)行數(shù)據(jù)庫開發(fā)的提示 :
-
MVT
設(shè)計(jì)模式中的Model
, 專門負(fù)責(zé)和數(shù)據(jù)庫交互.對應(yīng)(models.py)
- 由于
Model
中內(nèi)嵌了ORM框架
, 所以不需要直接面向數(shù)據(jù)庫編程. - 而是定義模型類, 通過
模型類和對象
完成數(shù)據(jù)庫表的增刪改查
. -
ORM框架
就是把數(shù)據(jù)庫表的行與相應(yīng)的對象建立關(guān)聯(lián), 互相轉(zhuǎn)換.使得數(shù)據(jù)庫的操作面向?qū)ο?
使用Django進(jìn)行數(shù)據(jù)庫開發(fā)的步驟 :
- 定義模型類
- 模型遷移
- 操作數(shù)據(jù)庫
1. 定義模型類
- 根據(jù)書籍表結(jié)構(gòu)設(shè)計(jì)模型類:
- 模型類:BookInfo
- 書籍名稱字段:name
- 根據(jù)人物表結(jié)構(gòu)設(shè)計(jì)模型類:
- 模型類:PeopleInfo
- 人物姓名字段:name
- 人物性別字段:gender
- 外鍵約束:book
- 外鍵要指定所屬的模型類book = models.ForeignKey(BookInfo)
- 說明 :
- 書籍-人物的關(guān)系為一對多. 一本書中可以有多個(gè)英雄.
- 不需要定義主鍵字段, 在生成表時(shí)會(huì)自動(dòng)添加, 并且值為自增長.
- 根據(jù)數(shù)據(jù)庫表的設(shè)計(jì)
- 在models.py中定義模型類,繼承自models.Model
from django.db import models # Create your models here. # 準(zhǔn)備書籍列表信息的模型類 class BookInfo(models.Model): # 創(chuàng)建字段瑟押,字段類型... name = models.CharField(max_length=10) # 準(zhǔn)備人物列表信息的模型類 class PeopleInfo(models.Model): name = models.CharField(max_length=10) gender = models.BooleanField() # 外鍵約束:人物屬于哪本書 book = models.ForeignKey(BookInfo)
2. 模型遷移 (建表)
-
遷移由兩步完成 :
- 生成遷移文件:根據(jù)模型類生成創(chuàng)建表的語句
python manage.py makemigrations
執(zhí)行遷移:根據(jù)第一步生成的語句在數(shù)據(jù)庫中創(chuàng)建表
python manage.py migrate
-
遷移前
image -
遷移后
image
提示:默認(rèn)采用sqlite3數(shù)據(jù)庫來存儲(chǔ)數(shù)據(jù)
五搀捷、站點(diǎn)管理
-
站點(diǎn): 分為
內(nèi)容發(fā)布
和公共訪問
兩部分 - 內(nèi)容發(fā)布的部分由網(wǎng)站的管理員負(fù)責(zé)查看、添加、修改嫩舟、刪除數(shù)據(jù)
-
Django
能夠根據(jù)定義的模型類自動(dòng)地生成管理模塊 - 使用
Django
的管理模塊, 需要按照如下步驟操作 :- 1.管理界面本地化
- 2.創(chuàng)建管理員
- 3.注冊模型類
- 4.發(fā)布內(nèi)容到數(shù)據(jù)庫
1.管理界面本地化
- 本地化是將顯示的語言氢烘、時(shí)間等使用本地的習(xí)慣,這里的本地化就是進(jìn)行中國化.
- 中國大陸地區(qū)使用簡體中文, 時(shí)區(qū)使用亞洲/上海時(shí)區(qū), 注意這里不使用北京時(shí)區(qū).
-
本地化前
image -
本地化后
image
2.創(chuàng)建管理員
- 創(chuàng)建管理員的命令 :
python manage.py createsuperuser
- 重置密碼
python manager.py changepassword 用戶名
-
登陸站點(diǎn)
:http://127.0.0.1:8000/admin
-
需要服務(wù)器是啟動(dòng)狀態(tài)
管理員登入界面
-
-
登陸站點(diǎn)成功
-
站點(diǎn)界面中沒有書籍和人物管理入口,因?yàn)闆]有注冊模型類
image
-
3.注冊模型類
-
在
應(yīng)用
的admin.py
文件中注冊模型類- 需要導(dǎo)入模型模塊 :
from book.models import BookInfo,PeopleInfo
image
- 需要導(dǎo)入模型模塊 :
-
注冊模型后
image
注冊模型成功后, 就可以在站點(diǎn)管理界面方便快速的管理數(shù)據(jù).
4.發(fā)布內(nèi)容到數(shù)據(jù)庫
發(fā)布內(nèi)容后家厌,優(yōu)化模型類展示
-
# 準(zhǔn)備書籍列表信息的模型類 class BookInfo(models.Model): # 創(chuàng)建字段播玖,字段類型... name = models.CharField(max_length=10) def __str__(self): """將模型類以字符串的方式輸出""" return self.name
image
六、視圖和URL
- 站點(diǎn)管理頁面做好了, 接下來就要做
公共訪問
的頁面了. - 對于
Django
的設(shè)計(jì)框架MVT
.- 用戶在URL中請求的是視圖.
- 視圖接收請求后進(jìn)行處理.
- 并將處理的結(jié)果返回給請求者.
- 使用視圖時(shí)需要進(jìn)行兩步操作
- 1.定義視圖
- 2.配置URLconf
1. 定義視圖
- 視圖就是一個(gè)
Python
函數(shù)饭于,被定義在應(yīng)用
的views.py
中. - 視圖的第一個(gè)參數(shù)是
HttpRequest
類型的對象reqeust
蜀踏,包含了所有請求信息
. - 視圖必須返回
HttpResponse
對象,包含返回給請求者的響應(yīng)信息
. - 需要導(dǎo)入
HttpResponse
模塊 :from django.http import HttpResponse
- 定義視圖函數(shù) : 響應(yīng)字符串
OK!
給客戶端
image
2. 配置URLconf
-
查找視圖的過程 :
- 1.請求者在瀏覽器地址欄中輸入U(xiǎn)RL, 請求到網(wǎng)站.
- 2.網(wǎng)站獲取URL信息.
- 3.然后與編寫好的URLconf逐條匹配.
- 4.如果匹配成功則調(diào)用對應(yīng)的視圖.
-
5.如果所有的URLconf都沒有匹配成功.則返回404錯(cuò)誤.
image
-
URLconf
入口image -
需要兩步完成
URLconf
配置- 1.在
項(xiàng)目
中定義URLconf
- 2.在
應(yīng)用
中定義URLconf
- 1.在
-
在
應(yīng)用
中定義URLconf
- 提示:一條
URLconf
包括URL規(guī)則掰吕、視圖兩部分URL規(guī)則使用正則表達(dá)式定義.
-
視圖就是在
views.py
中定義的視圖函數(shù).
image -
url匹配過程
image
- 提示:一條
3. 測試:請求訪問
-
訪問
http://127.0.0.1:8000/
image
4. 總結(jié)
視圖處理過程如下圖:
使用視圖時(shí)需要進(jìn)行兩步操作果覆,兩步操作不分先后
- 配置
URLconf
- 在
應(yīng)用/views.py
中定義視圖
七、總結(jié)View和URL匹配流程
八殖熟、模板
思考 : 網(wǎng)站如何向客戶端返回一個(gè)漂亮的頁面呢局待?
-
提示 :
- 漂亮的頁面需要
html
、css
菱属、js
. - 可以把這一堆字段串全都寫到視圖中, 作為
HttpResponse()
的參數(shù),響應(yīng)給客戶端.
- 漂亮的頁面需要
-
問題 :
- 視圖部分代碼臃腫, 耦合度高.
- 這樣定義的字符串是不會(huì)出任何效果和錯(cuò)誤的.
- 效果無法及時(shí)查看.有錯(cuò)也不容易及時(shí)發(fā)現(xiàn).
-
設(shè)想 :
- 是否可以有一個(gè)專門定義前端頁面的地方, 效果可以及時(shí)展示,錯(cuò)誤可以及時(shí)發(fā)現(xiàn),并且可以降低模塊間耦合度!
-
解決問題 :模板
-
MVT
設(shè)計(jì)模式中的T
,Template
-
在
Django
中, 將前端的內(nèi)容定義在模板中, 然后再把模板交給視圖調(diào)用, 各種漂亮钳榨、炫酷的效果就出現(xiàn)了.
模板使用步驟
- 創(chuàng)建模板
- 設(shè)置模板查找路徑
- 模板接收視圖傳入的數(shù)據(jù)
- 模板處理數(shù)據(jù)
1.創(chuàng)建模板
- 在
應(yīng)用
同級目錄下創(chuàng)建模板文件夾templates
. 文件夾名稱固定寫法. - 在
templates
文件夾下, 創(chuàng)建應(yīng)用
同名文件夾. 例,Book
- 在
應(yīng)用
同名文件夾下創(chuàng)建網(wǎng)頁模板
文件. 例 :index.html
image
2.設(shè)置模板查找路徑
3.模板接收視圖傳入的數(shù)據(jù)
-
視圖模板加載
image
4.模板處理數(shù)據(jù)
5. 查看模板處理數(shù)據(jù)成果
九、總結(jié)View-Templates流程
十纽门、配置和靜態(tài)文件
setting配置文件
1. BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
當(dāng)前工程的根目錄薛耻,Django會(huì)依此來定位工程內(nèi)的相關(guān)文件,我們也可以使用該參數(shù)來構(gòu)造文件路徑赏陵。
2. DEBUG
調(diào)試模式饼齿,創(chuàng)建工程后初始值為True,即默認(rèn)工作在調(diào)試模式下瘟滨。
- 作用:
- 修改代碼文件候醒,程序自動(dòng)重啟
-
Django程序出現(xiàn)異常時(shí),向前端顯示詳細(xì)的錯(cuò)誤追蹤信息杂瘸,例如
image - 而非調(diào)試模式下倒淫,僅返回Server Error (500)
注意:部署線上運(yùn)行的Django不要運(yùn)行在調(diào)式模式下,記得修改DEBUG=False和ALLOW_HOSTS败玉。
3. 本地語言與時(shí)區(qū)
Django支持本地化處理敌土,即顯示語言與時(shí)區(qū)支持本地化。
本地化是將顯示的語言运翼、時(shí)間等使用本地的習(xí)慣返干,這里的本地化就是進(jìn)行中國化,中國大陸地區(qū)使用簡體中文血淌,時(shí)區(qū)使用亞洲/上海時(shí)區(qū)矩欠,注意這里不使用北京時(shí)區(qū)表示财剖。
初始化的工程默認(rèn)語言和時(shí)區(qū)為英語和UTC標(biāo)準(zhǔn)時(shí)區(qū):
LANGUAGE_CODE = 'en-us' # 語言
TIME_ZONE = 'UTC' # 時(shí)區(qū)# 時(shí)區(qū)
將語言和時(shí)區(qū)修改為中國大陸信息:
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
靜態(tài)文件
項(xiàng)目中的CSS、圖片癌淮、js都是靜態(tài)文件躺坟。一般會(huì)將靜態(tài)文件放到一個(gè)單獨(dú)的目錄中,以方便管理乳蓄。在html頁面中調(diào)用時(shí)咪橙,也需要指定靜態(tài)文件的路徑,Django中提供了一種解析的方式配置靜態(tài)文件路徑虚倒。靜態(tài)文件可以放在項(xiàng)目根目錄下美侦,也可以放在應(yīng)用的目錄下,由于有些靜態(tài)文件在項(xiàng)目中是通用的魂奥,所以推薦放在項(xiàng)目的根目錄下菠剩,方便管理。
為了提供靜態(tài)文件耻煤,需要配置兩個(gè)參數(shù):
- STATICFILES_DIRS存放查找靜態(tài)文件的目錄
- STATIC_URL訪問靜態(tài)文件的URL前綴
示例
1) 在項(xiàng)目根目錄下創(chuàng)建static目錄來保存靜態(tài)文件赠叼。
2) 在bookmanager/settings.py中修改靜態(tài)文件的兩個(gè)參數(shù)為
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
3)此時(shí)在static添加的任何靜態(tài)文件都可以使用網(wǎng)址/static/文件在static中的路徑來訪問了。
例如违霞,我們向static目錄中添加一個(gè)index.html文件,在瀏覽器中就可以使用127.0.0.1:8000/static/index.html來訪問瞬场。
或者我們在static目錄中添加了一個(gè)子目錄和文件book/detail.html买鸽,在瀏覽器中就可以使用127.0.0.1:8000/static/book/detail.html來訪問。
App應(yīng)用配置
在每個(gè)應(yīng)用目錄中都包含了apps.py文件贯被,用于保存該應(yīng)用的相關(guān)信息眼五。
在創(chuàng)建應(yīng)用時(shí),Django會(huì)向apps.py文件中寫入一個(gè)該應(yīng)用的配置類彤灶,如:
from django.apps import AppConfig
class BookConfig(AppConfig):
name = 'book'
我們將此類添加到工程settings.py中的INSTALLED_APPS列表中看幼,表明注冊安裝具備此配置屬性的應(yīng)用。
AppConfig.name屬性表示這個(gè)配置類是加載到哪個(gè)應(yīng)用的幌陕,每個(gè)配置類必須包含此屬性诵姜,默認(rèn)自動(dòng)生成。
AppConfig.verbose_name屬性用于設(shè)置該應(yīng)用的直觀可讀的名字搏熄,此名字在Django提供的Admin管理站點(diǎn)中會(huì)顯示棚唆,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'book'
verbose_name = '圖書管理'