如果你看過我之前所寫的關於django的文章的話,你會發現每一篇都具有可操作性,都是從創建項目開始的,雖然中間之加了一些要講解的重點。這也是我博文的特點,我希望在你看到我這一篇文章的時候是可操作的,不管是否具備了相關基礎。
如果你是第一次接觸django,建議參考我的之關於django的內容練習一下:
http://www.cnblogs.com/fnng/category/581256.html
這一篇要介紹django是如何工作的。如果你把這過程梳理清晰了,那么你對django就算入門了。
一張流程圖告訴你,django的處理流程:
URL組成
作為網站的用戶,我們首先在瀏覽器的輸入框內輸入:http://127.0.0.1:8000/index/
URL地址由以下幾部分組成:
協議類型: HTTP ,FTP
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示等 。
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。
主機地址:itest.info ,127.0.0.1
前者是一個網址,網址通過域名解析服務器會找到對應的IP地址。后者就是一個IP地址。
127.0.0.1 指向的就是本機的IP地址。
端口號: 8000
端口號用於區分標識同一台主機的不同應用。一台主機上有很多應用,你訪問我這台主機時如果指定的是8000,那么就是知道是你來訪問我用django開發的blog的。當然,這個端口是可以任意分配的。
路徑 : /index/ 、/admin
一般用來表示主機上的一個目錄或文件地址。
urls的配置
django通過urls.py配置文件很好的處理了前端請求的指向,其中使用使用Python的正則表達式可以使匹配變得更靈活。
打開django下面的urls.py文件:
from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^index/$', 'blog.views.index'), )
r'^index/$'
這是一個使用了python的正則表達式。
字符串有前面加“ r ”是為了防止字符串中出現類似“\t”字符時被轉義。
django在拿到URL地址后,取端口號后面的文件夾路徑(/index/)進行配置,結果^index/$ 可以對這個文件路徑進行匹配。那么將指向blog.views.index 這個地址。
blog是文件夾,views是一個.py文件,index 則是函數名。
model模型
Django用模型在后台執行SQL代碼並把結果用Python的數據結構來描述。Django也使用模型來呈現SQL無法處理的高級概念。
模型用於數據庫的創建,在settings.py文件中配置數據庫的連接,例如一個mysql數據庫的配置:
…… DATABASES = { 'default': { 'ENGINE' : 'django.db.backends.mysql', 'HOST' : '127.0.0.1', 'PORT' : '3306', 'NAME' : 'myweb', 'USER' : 'user', 'PASSWORD' : '123456', } } ……
配置信息從上到下依次是驅動(ENGINE),主機地址(HOST),端口號(PORT),數據庫(NAME),登錄用戶名(USER),登錄密碼(PASSWORD)。
在應用的的models.py文件中創建模型,為了避免直接操作數據庫,通過創建模型去生成對應的數據庫表。
from django.db import models # Create your models here. class BlogsPost(models.Model): title = models.CharField(max_length = 150) body = models.TextField() timestamp = models.DateTimeField()
執行數據庫同步會創建一張PlogsPost表,表分別會有title、body、timestamp三個字段。其中title定義為char類型,定義最長150字符;body為text文本類型;timestamp為日期時間類型。
我們不用關心到底怎么創建表,只要創建好模型就好了,剩下的由djnago來幫我們生成對應的表。下面是將模型創建成數據庫表的命令:
D:\pydj\myweb>python manage.py makemigrations blog Migrations for 'blog': 0001_initial.py: - Create model BlogsPost D:\pydj\myweb>python manage.py syncdb Operations to perform: Apply all migrations: admin, blog, contenttypes, auth, sessions Running migrations: Applying blog.0001_initial... OK
首先是通過 makemigrations對某個應用(blog)下的模型執行遷移;然后通過syncdb檢測項目下的所有模型,發現模型有變動或未生成表,將重新生成相應的表。(在djnaog 1.7之前的版本只需要syncdb一個命令就可以完成同步)
views視圖
視圖可以看作是前端與數據庫的中間人,他會將前端想要的數據從數據庫中讀出來給前端。他也會將用戶要想保存的數據寫到數據庫。
views.py
#coding=utf-8 from django.shortcuts import render from blog.models import BlogsPost from django.shortcuts import render_to_response # Create your views here. def index(request): blog_list = BlogsPost.objects.all() return render_to_response('index.html',{'blog_list':blog_list})
這里index函數做了兩件事兒:
blog_list =BlogsPost.objects.all()
查詢到BlogsPost數據庫里的所有數據,賦值給blog_list變量。
return render_to_response('index.html',{'blog_list':blog_list})
通過render_to_response() 返回給瀏覽器一個index.html頁面,並且將blog_list變量的值也返回給index.html。
templates模板
模板就是我們所熟悉的頁面了,django自帶的有模板系統。它的主要作用是如何展示數據,比如視圖返回了一堆數據過來。是都循環顯示出來呢?還通過判斷只顯示你認為有用的呢? 當然,這里為了使頁面更漂亮需要借助前端技術,比如css、JavaScript等。
然后,我們就在瀏覽器上看到了index.html頁面了:
MTV開發模式
了解了django的組成部分之間,我們再來深入的探討一下django的開發模式。
MTV 開發模式
在鑽研更多代碼之前,讓我們先花點時間考慮下 Django 數據驅動 Web 應用的總體設計。 我們在前面章節提到過,Django 的設計鼓勵松耦合及對應用程序中不同部分的嚴格分割。 遵循這個理念的話,要想修改應用的某部分而不影響其它部分就比較容易了。 在視圖函數中,我們已經討論了通過模板系統把業務邏輯和表現邏輯分隔開的重要性。 在數據庫層中,我們對數據訪問邏輯也應用了同樣的理念。 把數據存取邏輯、業務邏輯和表現邏輯組合在一起的概念有時被稱為軟件架構的 Model-View-Controller(MVC)模式。 在這個模式中, Model 代表數據存取層,View 代表的是系統中選擇顯示什么和怎么顯示的部分,Controller 指的是系統中根據用戶輸入並視需要訪問模型,以決定使用哪個視圖的那部分。
為什么用縮寫?
像 MVC 這樣的明確定義模式的主要用於改善開發人員之間的溝通。 比起告訴同事,“讓我們采用抽象的數據存取方式,然后單獨划分一層來顯示數據,並且在中間加上一個控制它的層”,一個通用的說法會讓你收益,你只需要說:“我們在這里使用MVC模式吧。”。 Django 緊緊地遵循這種 MVC 模式,可以稱得上是一種 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含義:
- M ,數據存取部分,由django數據庫層處理,本章要講述的內容。
- V ,選擇顯示哪些數據要顯示以及怎樣顯示的部分,由視圖和模板處理。
- C ,根據用戶輸入委派視圖的部分,由 Django 框架根據 URLconf 設置,對給定 URL 調用適當的 Python 函數。
由於 C 由框架自行處理,而 Django 里更關注的是模型(Model)、模板(Template)和視圖(Views), Django 也被稱為 MTV 框架 。在 MTV 開發模式中:
- M 代表模型(Model),即數據存取層。 該層處理與數據相關的所有事務: 如何存取、如何驗證有效
- T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。
- V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋梁。
如果你熟悉其它的 MVC Web開發框架,比方說 Ruby on Rails,你可能會認為 Django 視圖是控制器,而Django 模板是視圖。 很不幸,這是對 MVC 不同詮釋所引起的錯誤認識。 在 Django 對 MVC 的詮釋中,視圖用來描述要展現給用戶的數據;不是數據 如何展現 ,而且展現 哪些 數據。 相比之下,Ruby on Rails 及一些同類框架提倡控制器負責決定向用戶展現哪些數據,而視圖則僅決定 如何展現數據,而不是展現 哪些 數據。
兩種詮釋中沒有哪個更加正確一些。 重要的是要理解底層概念。