Django介紹
1.簡(jiǎn)介
? 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評(píng)選為2013SDTimes100,位列"API、庫(kù)和框架"分類第6位,被認(rèn)為是該領(lǐng)域的佼佼者。
? Django的主要目的是簡(jiǎn)便、快速的開發(fā)數(shù)據(jù)庫(kù)驅(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) 重量級(jí)框架
對(duì)比Flask框架,Django原生提供了眾多的功能組件,讓開發(fā)更簡(jiǎn)便快速。
- 提供項(xiàng)目工程管理的自動(dòng)化腳本工具
- 數(shù)據(jù)庫(kù)ORM支持(對(duì)象關(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的全拼為Model-View-Controller,最早由TrygveReenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀(jì)80年代為程序語言Smalltalk發(fā)明的一種軟件設(shè)計(jì)模式,是為了將傳統(tǒng)的輸入(input)、處理(processing)、輸出(output)任務(wù)運(yùn)用到圖形化用戶交互模型中而設(shè)計(jì)的。隨著標(biāo)準(zhǔn)輸入輸出設(shè)備的出現(xiàn),開發(fā)人員只需要將精力集中在業(yè)務(wù)邏輯的分析與實(shí)現(xiàn)上。后來被推薦為Oracle旗下Sun公司Java EE平臺(tái)的設(shè)計(jì)模式,并且受到越來越多的使用ColdFusion和PHP的開發(fā)者的歡迎。現(xiàn)在雖然不再使用原來的分工方式,但是這種分工的思想被沿用下來,廣泛應(yīng)用于軟件工程中,是一種典型并且應(yīng)用廣泛的軟件架構(gòu)模式。后來,MVC的思想被應(yīng)用在了Web開發(fā)方面,被稱為Web MVC框架。 Django控件的設(shè)計(jì)也使用了這種思想,并為自己的框架命名為MVT
Django的MVT
- M全拼為Model,與MVC中的M功能相同,負(fù)責(zé)和數(shù)據(jù)庫(kù)交互,進(jìn)行數(shù)據(jù)處理。
- V全拼為View,與MVC中的C功能相同,接收請(qǐng)求,進(jìn)行業(yè)務(wù)處理,返回應(yīng)答。
- T全拼為Template,與MVC中的V功能相同,負(fù)責(zé)封裝構(gòu)造要返回的html。
3. Django學(xué)習(xí)資料
環(huán)境安裝
1.創(chuàng)建虛擬環(huán)境
mkvirtualenv django_py3_1.11 -p python3
? 注意需要聯(lián)網(wǎng)
2.安裝Django
使用Django1.11.1版本,注意需要聯(lián)網(wǎng)
pip install django == 1.11.11
3.復(fù)習(xí)虛擬環(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)建工程
使用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 demo
執(zhí)行后,會(huì)多出一個(gè)新目錄名為demo,此即為新創(chuàng)建的工程目錄
2.工程目錄說明
查看創(chuàng)建的工程目錄,結(jié)構(gòu)如下:
- 與項(xiàng)目同名的目錄,此處為demo。
- 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編寫的輕量級(jí)的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)端口號(hào)是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)目拆分為不同的子功能模塊,各功能模塊間可以保持相對(duì)的獨(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)建的demo工程中,想要?jiǎng)?chuàng)建一個(gè)用戶users子應(yīng)用模塊,可執(zhí)行:
cd ~/Desktop/code.demo
python manage.py startapp users
執(zhí)行后,可以看到工程目錄中多處一個(gè)名為users的子目錄。
2.子應(yīng)用目錄說明
查看此時(shí)的工程目錄,結(jié)構(gòu)如下:
- admin.py文件跟網(wǎng)站的后臺(tái)管理站點(diǎn)配置相關(guān)
- app.py文件用于配置了當(dāng)前子應(yīng)用的相關(guān)信息
- migrations目錄用于存放數(shù)據(jù)庫(kù)遷移歷史文件
- models.py文件用戶保存數(shù)據(jù)庫(kù)模型類
- tests.py文件用于開發(fā)測(cè)試用例,編寫單元測(cè)試
- views.py文件用于編寫web應(yīng)用視圖
3.注冊(cè)安裝子應(yīng)用
創(chuàng)建出來的子應(yīng)用目錄文件雖然被放到了工程項(xiàng)目目錄中,但是Django工程并不能立刻直接使用該子應(yīng)用,需要注冊(cè)安裝后才能使用.
在工程配置文件settings.py中,**INSTALLED_APPS項(xiàng)保存了工程中已經(jīng)注冊(cè)安裝的子應(yīng)用,初始工程中的INSTALLED_APPS如下:
注冊(cè)安裝一個(gè)子應(yīng)用的方法,即是將子應(yīng)用的配置信息文件apps.py中的Config類添加到INSTALLED_APPS列表中.
例如,將剛剛創(chuàng)建的users子應(yīng)用添加到工程中,可以在INSALLEDS_APPS列表中添加'users.apps.UsersConfig'.
創(chuàng)建視圖
同flask框架一樣,Django也用視圖來編寫Web應(yīng)用的業(yè)務(wù)邏輯.
Django的視圖是在子應(yīng)用的views.py中.
1.創(chuàng)建
打開剛創(chuàng)建的users模塊,在views中編寫視圖代碼:
from django.http import HttpResponse
def index(request):
"""
index視圖
:param request: 包含了請(qǐng)求信息的請(qǐng)求對(duì)象
:return: 響應(yīng)對(duì)象
"""
return HttpResponse("hello the world!")
說明:
- 視圖函數(shù)的第一個(gè)傳入?yún)?shù)必須定義,用于接收Django構(gòu)造的包含了請(qǐng)求數(shù)據(jù)的HTTPRequest對(duì)象,通常名為request
- 視圖函數(shù)的返回值必須為一個(gè)響應(yīng)對(duì)象,不能像flask那樣直接返回一個(gè)字符串,可以將要返回的字符串?dāng)?shù)據(jù)放到一個(gè)HTTPResponse對(duì)象中.
2.定義路由URL
1.在子應(yīng)用中新建一個(gè)urls.py文件用于保存該應(yīng)用的路由.
2.在users/urls.py文件中定義路由信息.
from django.conf.urls import url
from . import views
# urlpatterns是被django自動(dòng)識(shí)別的路由列表變量
urlpatterns = [
# 每個(gè)路由信息都需要使用url函數(shù)來構(gòu)造
# url(路徑, 視圖)
url(r'^index/$', views.index),
]
3.在工程總路由demo/urls.py中添加子應(yīng)用的路由數(shù)據(jù).
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默認(rèn)包含的
# 添加
url(r'^users/', include('users.urls')),
]
- 使用include來將子應(yīng)用users里的全部路由包含進(jìn)工程路由中;
- r"^users/"決定了users子應(yīng)用的所有路徑都以/users/開頭,如我們剛定義的視圖index,其最終的完整訪問路徑為/user/index/
include函數(shù)除了可以傳遞字符串之外,也可以直接傳遞應(yīng)用的urls模塊,如:
from django.conf.urls import url, include
from django.contrib import admin
import users.urls # 先導(dǎo)入應(yīng)用的urls模塊
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^users/', include('users.urls')),
url(r'^users/', include(users.urls)), # 添加應(yīng)用的路由
]
4.啟動(dòng)運(yùn)行
重新啟動(dòng)Django程序
python manage.py runserver
在瀏覽器中輸入網(wǎng)址127.0.0.1:8000/users/index/可看到返回的信息
配置文件
1.BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
當(dāng)前工程的根目錄,Django會(huì)依據(jù)此來定位工程內(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ò)誤追蹤信息
- 非調(diào)試下,僅返回錯(cuò)誤代碼
注意:部署線上運(yùn)行的Django不要運(yùn)行在調(diào)式模式下,記得修改DEBUG=False。
3.本地語言與時(shí)區(qū)
Django支持本地化處理,即顯示語言與時(shí)區(qū)支持本地化
本地化是將顯示的語言,語言等使用本地習(xí)慣 ,這里的本地化就是進(jìn)行中國(guó)化.中國(guó)大陸地區(qū)使用簡(jiǎn)體中文,時(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ū)修改為中國(guó)大陸信息
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_files目錄來保存靜態(tài)文件。
2) 在demo/settings.py中修改靜態(tài)文件的兩個(gè)參數(shù)為:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_files'),
]
3)此時(shí)在static_files添加的任何靜態(tài)文件都可以使用網(wǎng)址 /static/文件在static_files中的路徑 來訪問了。
例如,我們向static_files目錄中添加一個(gè)index.html文件,在瀏覽器中就可以使用127.0.0.1:8000/static/index.html來訪問。
或者我們?cè)趕tatic_files目錄中添加了一個(gè)子目錄和文件goods/detail.html,在瀏覽器中就可以使用127.0.0.1:8000/static/goods/detail.html來訪問。
注意
Django 僅在調(diào)試模式下(DEBUG=True)能對(duì)外提供靜態(tài)文件。
當(dāng)DEBUG=False工作在生產(chǎn)模式時(shí),Django不再對(duì)外提供靜態(tài)文件,需要是用collectstatic命令來收集靜態(tài)文件并交由其他靜態(tài)文件服務(wù)器來提供。
路由說明
路由定義位置
Django的主要路由信息定義在工程同名目錄下的urls.py文件中,該文件是Django解析路由的入口
每個(gè)子應(yīng)用為了保持相對(duì)獨(dú)立,可以在各個(gè)子應(yīng)用中定義屬于自己的urls.py來保存該應(yīng)用的路由,然后由主路由文件包含各應(yīng)用的子路由數(shù)據(jù).
除了上述方式外,也可以將工程的全部路由信息都定義在主路由文件中,子應(yīng)用不再設(shè)置urls.py.如:
from django.conf.urls import url
from django.contrib import admin
import users.views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^users/index/$', users.views.index)
]
路由命名
在定義路由的時(shí)候,可以為路由命名,方便查找特定視圖的具體路徑信息。
- 在使用include函數(shù)定義路由時(shí),可以使用namespace參數(shù)定義路由的命名空間,如
url(r'^users/', include('users.urls', namespace='users')),
命名空間表示,凡是users.urls中定義的路由,均屬于namespace指明的users名下。
命名空間的作用:避免不同應(yīng)用中的路由使用了相同的名字發(fā)生沖突,使用命名空間區(qū)別開。
- 在定義普通路由時(shí),可以使用name參數(shù)指明路由的名字,如
urlpatterns = [
url(r'^index/$', views.index, name='index'),
url(r'^say', views.say, name='say'),
]
reverse反解析
使用reverse函數(shù),可以根據(jù)路由名稱,返回具體的路徑,如:
from django.core.urlresolvers import reverse # 注意導(dǎo)包路徑
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
- 對(duì)于未指明namespace的,reverse(路由name)
- 對(duì)于指明namespace的,reverse(命名空間namespace:路由name)
路徑結(jié)尾斜線/的說明
Django中定義路由時(shí),通常以斜線/結(jié)尾,其好處是用戶訪問不以斜線/結(jié)尾的相同路徑時(shí),Django會(huì)把用戶重定向到以斜線/結(jié)尾的路徑上,而不會(huì)返回404不存在。如
urlpatterns = [
url(r'^index/$', views.index, name='index'),
]
用戶訪問 index 或者 index/ 網(wǎng)址,均能訪問到index視圖。
說明:
雖然路由結(jié)尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設(shè)計(jì)理念。
是否結(jié)尾帶/以所屬公司定義風(fēng)格為準(zhǔn)。
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 UsersConfig(AppConfig):
name = 'users'
我們將此類添加到工程settings.py中的INSTALLED_APPS列表中,表明注冊(cè)安裝具備此配置屬性的應(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 = 'users' verbose_name = '用戶管理'