Python Tutorial 第四堂(3)撰寫 Django 中第一個 View
Python Tutorial 第四堂(2)建立 App 與基本 ORM << 前情 瞭解如何使用 Django 基本的 ORM 操作之後,現在該是來撰寫第一個 View 的時候了,我們直接從練習中來瞭解如何撰寫。 練習 11:撰寫第一個 View 開啟 polls/views.py,在當中撰寫如下的程式碼: from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the poll index.") def detail(request, poll_id): return HttpResponse("You're looking at poll {id}.".format(id = poll_id)) def results(request, poll_id): return HttpResponse("You're looking at the results of poll {id}.".format(id = poll_id)) def vote(request, poll_id): return HttpResponse("You're voting on poll {id}.".format(id = poll_id)) 這兒的四個函式,將對應至不同的 URL 請求,目前只是簡單的作些字串顯示。每個函式的第一個參數,實際上會是 每個 URL 請求該如何對應至函式,可以在 polls 目錄下建立一個 urls.py 檔案進行定義: from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'), )
如果你仔細看上頭的規則表示式定義,會發現並沒有定義 from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^polls/', include('polls.urls')) ) 這個 urls.py 定義了全名的 URL 對應,在上頭可以看到定義了 完成以上定義之後,可以鍵入指令 Controller 還是 View?如果你曾使用過其他的 Web MVC 框架,可能會對這個練習感到疑惑,為什麼處理請求的函式是定義在 views.py 這樣的檔案名稱之中?在其他框架中,你知道處理請求參數不都是 Controller 嗎? 就名稱上來說,哪個才是標準名稱,其實是有爭議的;不過在 Django 之中,將特定 URL 對應的回呼函式認定為 View,那麼 Django 中 Controller 是在哪邊?也許就是 Django 框架本身! 實際上,大部份 Web MVC 框架確實也都會有一些請求的前置處理,當請求到達實際的 Controller 時,對請求要進行的處理,通常就是(或最好)只剩下轉發請求給商務 Model,取得樣版(Template)引擎必要的資料 Model,然後再轉發給 View 進行呈現。 Django 或許只是在實作上更強制地彰顯了這點,或許可以這麼說,Django 其實是個 MTV 框架,也就是 Model、Template、View 框架。 有些人會將 Django 與 Rails 相比較,也可能會問,在 Rails 中有 URLconfDjango 中呼叫哪個 view,是由 Python 的 URLconf(非正式名稱)模組來決定,這些模組是純 Python 撰寫,在 URL Pattern 與 Python 回呼函式(也就是你的 View)之間進行簡單的對應。
如果你還不清楚規則表示式,以下作些簡單的說明,mysite/urls.py 中定義的部份,意義如下: 而 polls/urls.py 中定義的部份,意義如下:
第四堂到這邊就先休息一下吧!第五堂我們還要繼續深入 Django,像是樣版系統 … 參考資料
- http://martinfowler.com/bliki/InversionOfControl.html
- http://docs.djangoproject.com/en/1.5/intro/overview/
- http://docs.djangoproject.com/en/1.5/intro/tutorial03/ 後續 >> Python Tutorial 第五堂(1)使用模版系統
|