Django第一天
Django介紹

logo
1.簡介
Django, 發音為[`dʒæŋɡəʊ] ,是用python語言寫的開源web開發框架,並遵循MVC設計。勞倫斯出版集團為了開發以新聞內容為主的網站,而開發出來了這個框架,於2005年7月在BSD許可證下發布。這個名稱來源於比利時的爵士音樂家DjangoReinhardt,他是一個吉普賽人,主要以演奏吉它為主,還演奏過小提琴等。 由於Django在近年來的迅速發展,應用越來越廣泛,被著名IT開發雜誌SDTimes評選為2013SDTimes100,位列"API、庫和框架"分類第6位,被認為是該領域的佼佼者。

Django信念
Django的 主要目的是簡便、快速的開發資料庫驅動的網站。 它強調程式碼複用,多個元件可以很方便的以"外掛"形式服務於整個框架,Django有許多功能強大的第三方外掛,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴充套件性。它還強調快速開發和DRY(DoNotRepeatYourself)原則。
2.特點
1) 重量級框架
對比Flask框架,Django原生提供了眾多的功能元件,讓開發更簡便快速。
- 提供專案工程管理的自動化指令碼工具
- 資料庫ORM支援(物件關係對映,英語:Object Relational Mapping)
- 模板
- 表單
- Admin管理站點
- 檔案管理
- 認證許可權
- session機制
- 快取
2)MVT模式
有一種程式設計模式叫 MVC ,其核心思想是 分工、解耦,讓不同的程式碼塊之間降低耦合,增強程式碼的可擴充套件性和可移植性,實現向後相容 。
MVC的全拼為 Model-View-Controller ,最早由TrygveReenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程式語言Smalltalk發明的一種軟體設計模式,是為了將傳統的輸入(input)、處理(processing)、輸出(output)任務運用到圖形化使用者互動模型中而設計的。隨著標準輸入輸出裝置的出現,開發人員只需要將精力集中在業務邏輯的分析與實現上。後來被推薦為Oracle旗下Sun公司Java EE平臺的設計模式,並且受到越來越多的使用ColdFusion和PHP的開發者的歡迎。現在雖然不再使用原來的分工方式,但是這種分工的思想被沿用下來,廣泛應用於軟體工程中,是一種典型並且應用廣泛的軟體架構模式。後來,MVC的思想被應用在了Web開發方面,被稱為Web MVC框架。 Django控制元件的設計也使用了這種思想,併為自己的框架命名為MVT
Django的MVT

MVT
- M全拼為Model,與MVC中的M功能相同,負責和資料庫互動,進行資料處理。
- V全拼為View,與MVC中的C功能相同,接收請求,進行業務處理,返回應答。
- T全拼為Template,與MVC中的V功能相同,負責封裝構造要返回的html。
3. Django學習資料
- ofollow,noindex">官方網站
- Github原始碼
- 1.11版英文文件
- 1.11版中文文件
- Django Book 教程
- Tange With Django 教程
環境安裝
1.建立虛擬環境
mkvirtualenv django_py3_1.11 -p python3
注意需要聯網
2.安裝Django
使用Django1.11.1版本,注意需要聯網
pip install django == 1.11.11
3.複習虛擬環境和pip命令
# 虛擬環境 mkvirtualenv# 建立虛擬環境 rmvirtualenv# 刪除虛擬環境 workon# 進入虛擬環境、檢視所有虛擬環境 deactivate# 退出虛擬環境 # pip pip install# 安裝依賴包 pip uninstall# 解除安裝依賴包 pip list# 檢視已安裝的依賴包 pip freeze# 凍結當前環境的依賴包
建立工程
使用flask框架時,專案工程目錄的組織與建立是需要我們自己動手建立完成的。
在Django中,專案工程目錄可以藉助Django提供的命令幫助我們建立。
1.建立
建立工程的命令為:
django-admin startproject 工程名稱
例如:想在桌面的code目錄中建立一個名為demo的專案工程,可執行如下命令:
cd ~/Desktop/code django-admin startproject demo
執行後,會多出一個新目錄名為demo,此即為新建立的工程目錄
2.工程目錄說明
檢視建立的工程目錄,結構如下:

工程目錄
- 與專案同名的目錄,此處為demo。
- settings.py是專案的整體配置檔案。
- urls.py是專案的URL配置檔案。
- wsgi.py是專案與WSGI相容的Web伺服器入口。
- manage.py是專案管理檔案,通過他管理專案
3.執行開發伺服器
在開發階段,為了能夠快速預覽到開發的效果,Django提供了一個純python編寫的輕量級的web伺服器,僅在開發階段使用。
執行伺服器命令如下:
python manage.py runserver ip:埠 或: python manage.py runserver
可以不寫IP和埠,預設IP是127.0.0.1,預設埠號是8000。
啟動後可見如下資訊:

runserver
在瀏覽器中輸入網址:127.0.0.1:8000即可看到效果。

runserver
- Django預設工作在除錯Debug模式下,如果增加,修改,刪除檔案,伺服器會自動重啟。
- 按ctrl+c停止伺服器
建立子應用
在web應用中,通常有一些業務功能模組是在不同的專案中都可以複用的,故在開發中通常將工程專案拆分為不同的子功能模組,各功能模組間可以保持相對的獨立,在其他工程專案中需要用到某個特定功能模組時,可以將該模組程式碼整體複製過去,達到複用。
在Flask框架中也有類似子功能應用模組的概念,即藍圖Blueprint。
Django的檢視編寫是放在子應用中的。
1.建立
在Django中,建立子應用模組目錄仍然可以通過命令來操作,即:
python manage.py startapp 子應用名稱
manage.py為上述建立工程時自動生成的管理檔案。
例如,在剛才建立的demo工程中,想要建立一個使用者users子應用模組,可執行:
cd ~/Desktop/code.demo python manage.py startapp users
執行後,可以看到工程目錄中多處一個名為users的子目錄。
2.子應用目錄說明
檢視此時的工程目錄,結構如下:

子目錄結構
- admin.py檔案跟網站的後臺管理站點配置相關
- app.py檔案用於配置了當前子應用的相關資訊
- migrations目錄用於存放資料庫遷移歷史檔案
- models.py檔案使用者儲存資料庫模型類
- tests.py檔案用於開發測試用例,編寫單元測試
- views.py檔案用於編寫web應用檢視
3.註冊安裝子應用
創建出來的子應用目錄檔案雖然被放到了工程專案目錄中,但是Django工程並不能立刻直接使用該子應用,需要註冊安裝後才能使用.
在工程配置檔案settings.py中,**INSTALLED_APPS項儲存了工程中已經註冊安裝的子應用,初始工程中的INSTALLED_APPS如下:

INSTALLED_APPS
註冊安裝一個子應用的方法,即是將子應用的配置資訊檔案apps.py中的Config類新增到INSTALLED_APPS列表中.
例如,將剛剛建立的users子應用新增到工程中,可以在INSALLEDS_APPS列表中新增 'users.apps.UsersConfig' .

INSTALLED_APPS
建立檢視
同flask框架一樣,Django也用檢視來編寫Web應用的業務邏輯.
Django的檢視是在子應用的views.py中.
1.建立
開啟剛建立的users模組,在views中編寫檢視程式碼:
from django.http import HttpResponse def index(request): """ index檢視 :param request: 包含了請求資訊的請求物件 :return: 響應物件 """ return HttpResponse("hello the world!")
說明:
- 檢視函式的第一個傳入引數必須定義,用於接收Django構造的包含了請求資料的 HTTPRequest 物件,通常名為 request
- 檢視函式的返回值必須為一個響應物件,不能像flask那樣直接返回一個字串,可以將要返回的字串資料放到一個HTTPResponse物件中.
2.定義路由URL
1.在子應用中新建一個 urls.py 檔案用於儲存該應用的路由.

路由結構
2.在users/urls.py檔案中定義路由資訊.
from django.conf.urls import url from . import views # urlpatterns是被django自動識別的路由列表變數 urlpatterns = [ # 每個路由資訊都需要使用url函式來構造 # url(路徑, 檢視) url(r'^index/$', views.index), ]
3.在工程總路由demo/urls.py中新增子應用的路由資料.
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls),# django預設包含的 # 新增 url(r'^users/', include('users.urls')), ]
- 使用include來將子應用users裡的全部路由包含進工程路由中;
- r"^users/" 決定了users子應用的所有路徑都以/users/開頭,如我們剛定義的檢視index,其最終的完整訪問路徑為 /user/index/
include函式除了可以傳遞字串之外,也可以直接傳遞應用的urls模組,如:
from django.conf.urls import url, include from django.contrib import admin import users.urls# 先匯入應用的urls模組 urlpatterns = [ url(r'^admin/', admin.site.urls), # url(r'^users/', include('users.urls')), url(r'^users/', include(users.urls)),# 新增應用的路由 ]
4.啟動執行
重新啟動Django程式
python manage.py runserver
在瀏覽器中輸入網址 127.0.0.1:8000/users/index/ 可看到返回的資訊
配置檔案
1.BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
當前工程的根目錄,Django會依據此來定位工程內的相關檔案,我們也可以使用該引數來構造檔案路徑
2.DEBUG
除錯模式,建立工程後初始值為True,即預設工作在除錯模式下.
作用:
- 修改程式碼檔案,程式自動重啟
- Django程式出現異常時,向前端顯示詳細的錯誤追蹤資訊
- 非除錯下,僅返回錯誤程式碼
注意:部署線上執行的Django不要執行在調式模式下,記得修改DEBUG=False。
3.本地語言與時區
Django支援本地化處理,即顯示語言與時區支援本地化
本地化是將顯示的語言,語言等使用本地習慣 ,這裡的本地化就是進行中國化.中國大陸地區使用 簡體中文 ,時區使用 亞洲/上海 時區,注意這裡不使用北京時區表示。
初始化的工程預設語言和時區為英語和UTC標準時區
LANGUAGE_CODE = 'en-us'# 語言 TIME_ZONE = 'UTC'# 時區
將語言和時區修改為中國大陸資訊
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'

中文配置
靜態檔案
專案中的css,圖片,js都是靜態檔案.一般會將靜態檔案放到一個單獨的目錄中,以方便管理.在html頁面中呼叫時,也需要指定靜態檔案的路徑,Django中提供了一種解析的方式配置靜態檔案路徑.靜態檔案可以放在專案根目錄下,也可以放在應用的根目錄下,由於有些靜態檔案在專案中是通用的,所以推薦放在專案的根目錄下,方便管理.
為了提供靜態檔案,需要配置兩個引數:
- STATICFILES_DIRS 存放查詢靜態檔案的目錄
- STATIC_URL 訪問靜態檔案的URL字首
示例
1) 在專案根目錄下建立static_files目錄來儲存靜態檔案。
2) 在demo/settings.py中修改靜態檔案的兩個引數為:
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static_files'), ]
3)此時在static_files新增的任何靜態檔案都可以使用網址 /static/檔案在static_files中的路徑 來訪問了。
例如,我們向static_files目錄中新增一個index.html檔案,在瀏覽器中就可以使用127.0.0.1:8000/static/index.html來訪問。
或者我們在static_files目錄中添加了一個子目錄和檔案goods/detail.html,在瀏覽器中就可以使用127.0.0.1:8000/static/goods/detail.html來訪問。
注意
Django 僅在除錯模式下(DEBUG=True)能對外提供靜態檔案。
當DEBUG=False工作在生產模式時,Django不再對外提供靜態檔案,需要是用collectstatic命令來收集靜態檔案並交由其他靜態檔案伺服器來提供。
路由說明

路由檢視
路由定義位置
Django的主要路由資訊定義在工程同名目錄下的urls.py檔案中,該檔案是Django解析路由的入口
每個子應用為了保持相對獨立,可以在各個子應用中定義屬於自己的urls.py來儲存該應用的路由,然後由主路由檔案包含各應用的子路由資料.
除了上述方式外,也可以將工程的全部路由資訊都定義在主路由檔案中,子應用不再設定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) ]
路由命名
在定義路由的時候,可以為路由命名,方便查詢特定檢視的具體路徑資訊。
- 在使用include函式定義路由時,可以使用namespace引數定義路由的名稱空間,如
url(r'^users/', include('users.urls', namespace='users')),
名稱空間表示,凡是users.urls中定義的路由,均屬於namespace指明的users名下。
名稱空間的作用:避免不同應用中的路由使用了相同的名字發生衝突,使用名稱空間區別開。
- 在定義普通路由時,可以使用name引數指明路由的名字,如
urlpatterns = [ url(r'^index/$', views.index, name='index'), url(r'^say', views.say, name='say'), ]
reverse反解析
使用reverse函式,可以根據路由名稱,返回具體的路徑,如:
from django.core.urlresolvers import reverse# 注意導包路徑 def index(request): return HttpResponse("hello the world!") def say(request): url = reverse('users:index')# 返回 /users/index/ print(url) return HttpResponse('say')
- 對於未指明namespace的,reverse(路由name)
- 對於指明namespace的,reverse(名稱空間namespace:路由name)
路徑結尾斜線/的說明
Django中定義路由時,通常以斜線/結尾,其好處是使用者訪問不以斜線/結尾的相同路徑時,Django會把使用者重定向到以斜線/結尾的路徑上,而不會返回404不存在。如
urlpatterns = [ url(r'^index/$', views.index, name='index'), ]
使用者訪問 index 或者 index/ 網址,均能訪問到index檢視。
說明:
雖然路由結尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設計理念。
是否結尾帶/以所屬公司定義風格為準。
app應用配置
在每個應用目錄中都包含了apps.py檔案,用於儲存該應用的相關資訊。
在建立應用時,Django會向apps.py檔案中寫入一個該應用的配置類,如
from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users'
我們將此類新增到工程settings.py中的INSTALLED_APPS列表中,表明註冊安裝具備此配置屬性的應用。
-
AppConfig.name屬性表示這個配置類是載入到哪個應用的,每個配置類必須包含此屬性,預設自動生成。
-
AppConfig.verbose_name屬性用於設定該應用的直觀可讀的名字,此名字在Django提供的Admin管理站點中會顯示,如
from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users' verbose_name = '使用者管理'