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