1. 視圖 視圖的功能就是接收請求,進行處理,與M和T進行交互,返回應答。 返回html內容HttpResponse,也可能重定向redirect,還可以返回json數據。 1.1 URLconf 1.1.1 配置 用戶通過在瀏覽器的地址欄中輸入網址請求網站,對於Django開發的網站,由哪一個視圖 ...
1. 視圖
視圖的功能就是接收請求,進行處理,與M和T進行交互,返回應答。
返回html內容HttpResponse,也可能重定向redirect,還可以返回json數據。
1.1 URLconf
1.1.1 配置
用戶通過在瀏覽器的地址欄中輸入網址請求網站,對於Django開發的網站,由哪一個視圖進行處理請求,是由url匹配找到的。
在Urltest/settings.py中通過ROOT_URLCONF指定url配置,預設已經有此配置。
打開Urltest/urls.py可以看到預設配置。
在Urltest/urls.py中進行包含配置,在各自應用中創建具體配置。
定義urlpatterns列表,存儲url()對象,這個名稱是固定的。
urlpatterns中的每個正則表達式在第一次訪問它們時被編譯,這使得運行很快。
1.1.2 語法
url()對象,被定義在django.conf.urls包中,有兩種語法結構。
語法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如下:
參數的名字是任意的如a1、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模板渲染。
視圖處理過程如下圖: