一、Django 介紹
在 Web 早期階段,開發者手動編寫每個頁面。更新網站要編輯 HTML;重新設計要重新制作每一個網頁,而 且一次只能改一個網頁。隨着網站體量的增大,這種方式立馬變得繁瑣、浪費時間,最終變得不切實際。
NCSA(National Center for Supercomputing Applications,國家超級計算應用中心,第一款圖形 Web 瀏覽器 Mosaic 就是在這裏開發出來的)一羣富於創新的黑客解決了這個問題,他們讓 Web 服務器派生外部程序, 動態生成 HTML。他們把這一協議稱爲通用網關接口(Common Gateway Interface,CGI),自此,Web 完全 變了樣。如今,很難想象 CGI 帶來的變革:CGI 不再把 HTML 頁面視作硬盤中存儲的文件,而是把頁面看 做資源,可以按需動態生成。
CGI 的開發促使了第一代動態網站的出現。然而,CGI 自身也有問題:CGI 腳本包含大量重複的樣板代碼, 導致代碼難以複用,而且新手難以編寫和理解。
PHP 解決了這些問題中的多數,在 Web 開發界引起了一陣風暴。PHP 現在是創建動態網站最流行的工具, 多門類似的語言(ASP、JSP,等等)都參照了 PHP 的設計原則。PHP 的主要創新是易於使用:PHP 代碼直 接嵌入普通的 HTML 中;對學過 HTML 的人來說,學習曲線極爲平緩。
但是,PHP 也有自身的問題:就是因爲易於使用,寫出的代碼凌亂、重複,設計不周。更糟的是,PHP 沒有 爲程序員提供多少防止安全漏洞的保護機制,很多 PHP 開發者意識到這一點再去學習相關的知識就晚了。
上述問題以及類似的缺陷直接促使了“第三代”Web 開發框架的湧現。Web 開發的新方式也提升了人們的雄 心,現在 Web 開發者每天所做的工作越來越多。
Django 就是爲了迎接這些雄心而誕生的。
二、Django入門及配置
-
創建Django項目:django-admin startproject 項目名
-
Setting 配置介紹:
- TIME_ZONE 時區設置
- INSTALLED_APPS Django默認自帶的應用
- django.contrib.admin:管理後臺
- django.contrib.auth:身份驗證系統
- django.contrib.contenttypes:內容類型框架
- django.contrib.sessions:會話框架
- django.contrib.messages:消息框架
- django.contrib.staticfiles:管理靜態文件的框架
-
常見設計模式:MVC
- 模型(M)是數據的表述。它不是真正的數據,而是數據的接口。使用模型從數據庫中獲取數據時, 無需知道底層數據庫錯綜複雜的知識。模型通常還會爲數據庫提供一層抽象,這樣同一個模型就能使 用不同的數據庫。
- 是你看到的界面。它是模型的表現層。在電腦中,視圖是你在瀏覽器中看到的 Web 應用的頁面,或者是桌面應用的 UI。視圖還提供了收集用戶輸入的接口。
- 控制器©控制模型和視圖之間的信息流動。它通過程序邏輯判斷通過模型從數據庫中獲取什麼信 息,以及把什麼信息傳給視圖。它還通過視圖從用戶那裏收集信息,並且實現業務邏輯:變更視圖, 或者通過模型修改數據,或者二者兼具。
-
Django設計模式:MVT
- 模型(M)既數據訪問層,這一層包含了所有數據相關的功能及數據庫和數據模型
- 模版(T)既表現層,這一層包含了表現的相關決策
- 視圖(V)既業務邏輯層,這一層包含了訪問模型和如何找到適合的模版的邏輯,視圖就是模型和模版的橋樑
-
視圖和URL:配置URL相當於Django驅動網站的目錄,簡單來講,URL配置把URL映射到相應的視圖函數上。我們以這種方式告訴Django,訪問哪些URL時調用哪些代碼。在使用命令創建的DJango項目中是關於Django項目的一些配置管理文件其中 urls.py 是Django項目中URL的聲明配置文件。
- include:用於導入另一個URL配置文件
- urlpatterns:負責定義URL和處理URL的代碼之間的映射
- url():這個函數負責告訴Django如何處理配置的URL,使用哪些類方法或者函數
-
URL格式說明:url(r"^index/$", IndexView.as_view(), name=“index”)
- 正則表達式:DJango的URL配置允許使用任何複雜的正則表達式匹配複雜的URL
- r :在Python語法裏,字符串中的反斜線代表某種轉義特殊字符,所以需要使用r來聲明爲“原始字符串”裏面的反斜線不用於轉義
- :表示在字符串的開頭匹配模型,例如:r“index/” 表示任何以 index/ 開頭的URL都可以被匹配
- ” 表示任何以 /index/ 結尾的URL都可以被匹配
-
ROOT_URLCONF:它是DJango中一個重要的配置選項,它告訴DjangoURL配置在哪個Python模塊中,當接受請求後,Django 加載 ROOT_URLCONF 設置指定的 URL 配置,然後按照順序檢查URL配置中每個URL的配置模式,依次與請求的URL做比較,直到找到配置模式爲止。
-
Django處理請求的過程:
- 請求URL例如:/index
- Django 查看 ROOT_URLCONF 設置,找到根 URL 配置
- Django 比較 URL 配置中的各個 URL 模式,找到與 /hello/ 匹配的配置模式
- 找到匹配的配置模式後,調用對應的視圖函數
- 視圖函數返回對應的數據
-
URL配置和松耦合:松耦合是一種軟件開發方式,其價值是讓組件可以互換,如何兩部分代碼是送耦合,那個改動其中一部分,對另一部分幾乎沒有影響,在DJango應用中,URL的定義與所調用視圖的函數是送耦合的關係,既某個功能使用哪個URL與視圖函數的實現本身放在兩個地方。
-
動態URL:可以攜帶參數的URL,首先HTTP協議向服務器傳參的途徑:
- 使用正則提取URL特定部分,如:/api/index/2018
- 查詢字符串(query string)形如 key1=value1&key2=value2
- 請求體(body)中發送數據,如表單數據、Json、XML
- HTTP報文的頭 header 中
-
URL路徑參數:如果想從URL中獲取值,需要在正則表達式中使用分組
- 位置參數:http://127.0.0.1:8000/18/188/ 提取 18、188
url(r'^(\d+)/(\d+)/$', views.index)
- 關鍵字參數:同樣提取 http://127.0.0.1:8000/18/188/ 18、188
url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index)
當使用了關鍵字參數時,那麼視圖函數中的偏移量的參數名也要和關鍵字參數名相同
-
查詢字符串:獲取請求路徑中的查詢字符串參數(形如
?k1=v1&k2=v2
)通過request.GET
屬性獲取,返回QueryDict
對象,使用 request.GET.get() 來獲取參數 -
請求體:請求體數據格式不固定,可以是表單類型字符串,也可以是JSON、XML(可以發送請求體數據的請求方式有 POST、PUT、PATCH、DELETE)
- 表單類型:前端發送的表單類型的請求體數據,可以request.POST 屬性獲取,返回QueryDict對象
- 非表單類型:DJango無法自動解析可以直接 request.body 獲取原始的請求體數據,然後按照對應的格式解析即可