# Views and URLconfs ![Django 處理 HTTP request 產生 response 的流程](https://box.kancloud.cn/2015-08-18_55d2cc19b90e1.png) 在前面的介紹,我們有提到 Django 的 MTV 架構。其處理 request 的流程如下: 1. 瀏覽器送出 **HTTP Request** 1. Django 依據 **URL Conf** 分配至對應的 View 1. View 進行資料庫的操作或其他運算,並回傳 Http Response 物件 1. 瀏覽器依據 **HTTP Response**,顯示網頁畫面 這一章,我們將透過 **Hello World** 範例 ,瞭解 Django 如何處理一個 request 的流程。 ### Django Views Django view 其實是一個 function,**處理 HttpRequest 物件,並回傳 HttpResponse 物件**,大致說明如下: - **會收到`HttpRequest 物件`參數:** Django 從網頁接收到 request 後,會將 request 中的資訊封裝產生一個 [HttpRequest](https://docs.djangoproject.com/en/1.7/ref/request-response/#httprequest-objects) 物件,並當成第一個參數,傳入對應的 view function。 - **需要回傳`HttpResponse物件`:**[HttpResponse](https://docs.djangoproject.com/en/1.7/ref/request-response/#httpresponse-objects) 物件裡面包含: - HttpResponse.content - HttpResponse.status_code ...等 ### 建立第一個 View 首先建立一個名為 hello_world 的 View。 在`trips/views.py`輸入下列程式碼: ~~~ # trips/views.py from django.http import HttpResponse def hello_world(request): return HttpResponse("Hello World!") ~~~ 以上程式在做的事就是: 1. 從 django.http 模組中引用 `HttpResponse` 類別 1. 宣告 **hello_world** 這個 View 1. 當 **hello_world** 被呼叫時,回傳包含字串 `Hello World!` 的 **HttpResponse** 物件。 ### Django Urls 最後,Django 需要知道 **URL 與 View 的對應關係**。 例如: 有人瀏覽 [http://127.0.0.1:8000/hello/](http://127.0.0.1:8000/hello/) ,`hello_world()` 這個 view function 需要被執行。 而這個對應關係就是 `URL conf` (URL configuration)。 **URL Conf** - 通常定義在`urls.py` - 是一連串的規則 (url pattern) - Django 收到 request 時,會一一比對 URL Conf 中的規則,決定要執行哪個 view function 現在我們來設定,Hello World 範例的 URL Conf: 打開 startproject 時自動產生的`urls.py`,先 import 剛剛寫的 view function,然後在 `urlpatterns` 中加入下面這行: ~~~ url(r'^hello/$', hello_world), ~~~ 現在 `mysite/urls.py` 的內容應該會像下面這樣: ~~~ # mysite/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin # import view functions from trips app from trips.views import hello_world urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^hello/$', hello_world), ) ~~~ 以上程式透過 [url()](https://docs.djangoproject.com/en/1.7/ref/urls/#django.conf.urls.url) function 傳入兩個參數 `regex`, `view`: ~~~ url(regex,view) ~~~ - **regex** -- 定義的 URL 規則 - 規則以 regular expression 來表達 - *r'^hello/$'* 代表的是 `hello/` 這種 URL - **view** -- 對應的 view function - 指的是 `hello_world()` 這個 view - *'trips.views.hello_world'* -- `trips` 裡的 `views.py` 中的 `hello_world()` function ### 測試 Hello World 現在,啟動你的 web server。 (如果剛剛沒關閉的話,通常 Django 會在你修改程式碼後,自動重新啟動 web server) ~~~ python manage.py runserver ~~~ 在瀏覽器輸入 [http://127.0.0.1:8000/hello/](http://127.0.0.1:8000/hello/),你會看到網頁顯示我們在 HttpResponse 傳入的文字`Hello World!`。 ![](https://box.kancloud.cn/2015-08-18_55d2cc19ca19f.png)