1. 程式人生 > >django框架流程解析

django框架流程解析

以後的文章可能都會發在github部落格上了,現在暫時還懶得弄域名和伺服器。地址:http://jameeeees.github.io/
最近在學習django的框架 現在將它梳理一番
現在我將綜合程式碼來解析這一流程 假設我現在寫了一個網頁 該網頁(project)的名稱為my_blog 首先當我們輸入一個網址時 例如127.0.0.1:8080/blog/login/ 首先這個網址會通過當前project主檔案下的setting.py中的設定來找到跳轉網頁的集合。 setting.py中主要包括:                               APPS-應用;                               Middleware-中介軟體;                               Template-模板;                               Database-資料庫;                               ROOT_URLCONF='my_blog.urls'; 之後我們會對網頁做很多的工作,比如新建一個app,比如增添自己的模板,比如更換不同的資料庫。無論什麼操作,當執行之後,別忘了回到setting.py中來修改。因為這個檔案就相當於一個索引,網頁解析先通過它,假如沒有在這裡更改,那麼程式將無法通過這個索引找到需要的目標檔案。 跳轉到my_blog.urls實際上是跳轉到了my_blog檔案下的urls.py檔案中,urls.py中的程式碼主要如下:
                              urlpatterns=[url(r'^admin/',include(admin.site.urls)),     
                               <span style="white-space:pre">		</span>  url(r'^blog/',include('my_blog.views.first_page'))
                          <span style="white-space:pre">		</span> ]


需要說明的是,假如我輸入的url是127.0.0.1:8080/polls/login/,傳入setting.py的只是127.0.0.1:8080之後的字串。可以看到,假如網址的開頭部分和括號中的正則表示式相符的話,即跳轉到my_blog的一個views中的first_page方法中去。正則表示式中^表示只在字串的開頭匹配。 確定了url對應的檔案,那麼接下來就要跳轉到views中去了。 views,即為檢視,就是返回給使用者的html介面,此時views會根據Model和Form以及Template來確定這個views的樣式 views檔案的程式碼形式大致如下:    
from django.http import HttpResponse
def first_page(request):
<span style="white-space:pre">	</span>return HttpResponse('<p>hello world</p>')
def ...


可以看到 在views中有很多函式,第一個就是之前我們在urls.py中已經見過的first_page函式,它會返回一個HttpResponse。關於request的內容請參見《圖解Http協議》,在此不再贅述。 至此,輸出的views只是單薄的文字,一行hello world,這還不是我們所見到的網站。回到一開始的那張圖片,我們可以看到,有三個模組為views提供了不同的資源。 我們先來說說模型(Model) 假設我們使用的是MySQL資料庫,在傳統的MySQL中,資料模型是表。在django下,一個表為一個類。表的每一列是該類的一個屬性。在models.py中,我們建立一個只有一列的表,即只有一個屬性的類:
from django.db import models

class Character(models.Model):
    name = models.CharField(max_length=200)
    def __unicode__(self):
        return self.name


類Character定義了資料模型,它需要繼承自models.Model。在MySQL中,這個類實際上是一個表。表只有一列,為name。可以看到,name屬性是字元型別,最大長度為200。 CharField適用於較短的的字串欄位,假如文字很長,應該用TextField。 類Character有一個__unicode__()方法,用來說明物件的字元表達方式。 之前我們說了,根據前面的圖,Model是提供給views的,下面我們將在views中新增Model,下面是一個例子:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from west.models import Character
def staff(request):
    staff_list = Character.objects.all()
    staff_str  = map(str, staff_list)
    return HttpResponse("<p>" + ' '.join(staff_str) + "</p>")


這樣,我們就能通過views使用Model並在最終的網頁上看到它了 再說說模板 Template 我們所需要的模板同樣也需要在setting.py中說明,你可以把setting.py當作一個類似標頭檔案的東西,這些東西都需要在標頭檔案中宣告。大概形式是下面這樣:
# Template dir
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates/west/'),
)

這就告訴了django去哪裡尋找這個模板 是在templates/west/這個路徑下 同時我們聲明瞭模板之後,我們就要使用它。還記得開頭的圖片嗎,模板(Model)是給檢視(Views)使用的。 我們在Views中這樣使用它:
# -*- coding: utf-8 -*-
#from django.http import HttpResponse
from django.shortcuts import render

def templay(request):
    context          = {}
    context['label'] = 'Hello World!'
    return render(request, 'templay.html', context)


這個模板的名字叫做 templay.html 再來回顧一下整個流程。west/views.py中的templay()在返回時,將環境資料context傳遞給模板templay.html。Django根據context元素中的鍵值,將相應資料放入到模板中的對應位置,生成最終的http回覆。 這一模板系統可以與Django的其它功能相互合作。我們可以從資料庫中提取出了資料。如果將資料庫中的資料放入到context中,那麼就可以將資料庫中的資料傳送到模板。 表單的部分暫時還沒有接觸,不過用法跟模板差不多。 上述就是django框架的大致運作流程