Django框架(八):視圖(一) URLconf、視圖

1. 視圖

視圖的功能就是接收請求,進行處理,與M和T進行交互,返回應答。html

返回html內容HttpResponse,也可能重定向redirect,還能夠返回json數據。python

1.1 URLconf

1.1.1 配置

用戶經過在瀏覽器的地址欄中輸入網址請求網站,對於Django開發的網站,由哪個視圖進行處理請求,是由url匹配找到的。正則表達式

在Urltest/settings.py中經過ROOT_URLCONF指定url配置,默認已經有此配置。django

打開Urltest/urls.py能夠看到默認配置。json

在Urltest/urls.py中進行包含配置,在各自應用中建立具體配置。瀏覽器

定義urlpatterns列表,存儲url()對象,這個名稱是固定的。服務器

urlpatterns中的每一個正則表達式在第一次訪問它們時被編譯,這使得運行很快。函數

1.1.2 語法

url()對象,被定義在django.conf.urls包中,有兩種語法結構。post

語法1:通常在自定義應用中建立一個urls.py來定義url。網站

這種語法用於Urltest/urls.py中,目的是將應用的urls配置到應用內部,數據更清晰而且易於維護。

url(正則,include('應用.urls'))

例如booktest中的urls。

url(r'^',include('booktest.urls')),

在booktest目錄下建立urls.py文件。

語法2:指定URL和視圖函數的對應關係。

在應用內部建立urls.py文件,指定請求地址與視圖的對應關係。

url(正則,'視圖函數名稱')

例如在booktest/urls.py中建立首頁的url。

from django.conf.urls import url
from booktest import views
urlpatterns=[
    url(r'^$',views.index),
]

在booktest/views.py中建立視圖index。 

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("視圖函數index")

正則部分推薦使用r,表示字符串不轉義,這樣在正則表達式中使用\只寫一個就能夠。 說明2:不能在開始加反斜槓,推薦在結束加反斜槓。

正確:index/
正確:index
錯誤:/index
錯誤:/index/

1.1.3 獲取值

請求的url被看作是一個普通的python字符串,進行匹配時不包括域名、get或post參數。 如請求地址以下:

http://127.0.0.1:8000/delete1/?a=10

去除掉域名和參數部分,並將最前面的/去除後,只剩下以下部分與正則匹配。

delete1/

打開booktest/urls.py文件,定義與這個地址匹配的url以下:

url(r'^delete\d+/$',views.show_arg),

在booktest/views.py中建立視圖show_arg。

def show_arg(request):
    return HttpResponse('show_arg')

啓動服務器,輸入上面的網址,瀏覽器中效果以下圖。

能夠在匹配過程當中從url中捕獲參數,每一個捕獲的參數都做爲一個普通的python字符串傳遞給視圖。

獲取值須要在正則表達式中使用小括號,分爲兩種方式:

  • 位置參數
  • 關鍵字參數

兩種參數的方式不要混合使用,在一個正則表達式中只能使用一種參數方式。

方式1:位置參數

直接使用小括號,經過位置參數傳遞給視圖。

爲了提取參數,修改上面的正則表達式以下:

url(r'^delete(\d+)/$',views.show_arg),

修改視圖show_arg以下:

參數的名字是任意的如a一、b8,儘可能作到見名知意。

def show_arg(request,id):
    return HttpResponse('show arg %s'%id)

刷新瀏覽器頁面,效果以下圖:

在地址欄輸入以下地址: 

方式2:關鍵字參數

在正則表達式部分爲組命名。 

修改正則表達式以下:

其中?P部分表示爲這個參數定義的名稱爲id,能夠是其它名稱,起名作到見名知意。

url(r'^delete(?P<id1>\d+)/$',views.show_arg),

修改視圖show_arg以下:

視圖show_arg此時必需要有一個參數名爲id1,不然報錯。

def show_arg(request,id1):
    return HttpResponse('show arg %s'%id1)

刷新瀏覽器頁面,效果以下圖:

1.2 視圖

視圖就是python中的函數,視圖通常被定義在"應用/views.py"文件中,此例中爲"booktest/views.py"文件。視圖必須返回一個HttpResponse對象或子對象做爲響應。響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤等。

1.2.1 url匹配的過程

url:http://127.0.0.1:8000/aindex?a=1

1) 去除域名和後面的參數,剩下/aindex,再把前面的/去掉,剩下aindex。

2) 拿aindex先到項目的url.py文件中進行從上到下的匹配,匹配成功以後執行後面對應的處理動做,就是把匹配成功的部分a字符去除,而後拿剩下的部分index到應用的urls.py文件中再進行從上到下的匹配。

3) 若是匹配成功則調用相應的視圖產生內容返回給客戶端。若是匹配失敗則產生404錯誤。

1.2.2 內置錯誤視圖

Django內置處理HTTP錯誤的視圖,主要錯誤及視圖包括: 

  • 404錯誤:page not found視圖
  • 500錯誤:server error視圖

若是想看到錯誤視圖而不是調試信息,須要修改djangotest/setting.py文件的DEBUG項。

DEBUG = False
ALLOWED_HOSTS = ['*', ]

(1) 404錯誤及視圖

將請求地址進行url匹配後,沒有找到匹配的正則表達式,則調用404視圖,這個視圖會調用404.html的模板進行渲染。視圖傳遞變量request_path給模板,表示致使錯誤的URL。

在templates中建立404.html。

定義代碼以下: 

<html>
<head>
    <title></title>
</head>
<body>
找不到了
<hr/>
{{request_path}}
</body>
</html>

在瀏覽器中輸入以下網址:

http://127.0.0.1:8000/test/

運行效果以下圖:

(2) 500錯誤及視圖 

在視圖中代碼運行報錯會發生500錯誤,調用內置錯誤視圖,使用templates/500.html模板渲染。

視圖處理過程以下圖:

相關文章
相關標籤/搜索