一個(gè)視圖函數(shù),或者簡短來說叫做視圖,是一個(gè)簡單的Python函數(shù),它接受web請求,并且返回web響應(yīng)。響應(yīng)可以是一張網(wǎng)頁的HTML內(nèi)容,一個(gè)重定向,一個(gè)404錯(cuò)誤,一個(gè)XML文檔,或者一張圖片. . . 是任何東西都可以。無論視圖本身包含什么邏輯,都要返回響應(yīng)。代碼寫在哪里也無所謂,只要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什么神奇的地方”。為了能夠把代碼放在某個(gè)地方,慣例是把視圖放在叫做views.py的文件中,然后把它放到你的項(xiàng)目或者應(yīng)用目錄里。
下面是一個(gè)返回當(dāng)前日期和時(shí)間作為HTML文檔的視圖:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
讓我們逐行閱讀上面的代碼:
Django中的時(shí)區(qū)
Django中包含一個(gè)TIME_ZONE設(shè)置,默認(rèn)為America/Chicago??赡懿⒉皇悄阕〉牡胤剑阅憧赡軙谠O(shè)置文件里修改它。
所以,再重復(fù)一遍,這個(gè)視圖函數(shù)返回了一個(gè)包含當(dāng)前日期和時(shí)間的HTML頁面。你需要?jiǎng)?chuàng)建URLconf來展示在特定的URL這一視圖; 詳見URL 分發(fā)器。
在Django中返回HTTP錯(cuò)誤是相當(dāng)容易的。有一些HttpResponse的子類代表不是200(“OK”)的HTTP狀態(tài)碼。你可以在request/response文檔中找到所有可用的子類。你可以返回那些子類的一個(gè)實(shí)例,而不是普通的HttpResponse ,來表示一個(gè)錯(cuò)誤。例如:
from django.http import HttpResponse, HttpResponseNotFound
def my_view(request):
# ...
if foo:
return HttpResponseNotFound('<h1>Page not found</h1>')
else:
return HttpResponse('<h1>Page was found</h1>')
由于一些狀態(tài)碼不太常用,所以不是每個(gè)狀態(tài)碼都有一個(gè)特化的子類。然而,如HttpResponse文檔中所說的那樣,你也可以向HttpResponse的構(gòu)造器傳遞HTTP狀態(tài)碼,來創(chuàng)建你想要的任何狀態(tài)碼的返回類。例如:
from django.http import HttpResponse
def my_view(request):
# ...
# Return a "created" (201) response code.
return HttpResponse(status=201)
由于404錯(cuò)誤是最常見的HTTP錯(cuò)誤,所以處理這一錯(cuò)誤的方式非常便利。
class django.http.Http404
當(dāng)你返回一個(gè)像HttpResponseNotFound這樣的錯(cuò)誤時(shí),它會輸出這個(gè)錯(cuò)誤頁面的HTML作為結(jié)果:
return HttpResponseNotFound('<h1>Page not found</h1>')
為了便利起見,也因?yàn)槟愕恼军c(diǎn)有個(gè)一致的404頁面是個(gè)好主意,Django提供了Http404異常。如果你在視圖函數(shù)中的任何地方拋出Http404異常,Django都會捕獲它,并且?guī)螲TTP404錯(cuò)誤碼返回你應(yīng)用的標(biāo)準(zhǔn)錯(cuò)誤頁面。
像這樣:
from django.http import Http404
from django.shortcuts import render_to_response
from polls.models import Poll
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404("Poll does not exist")
return render_to_response('polls/detail.html', {'poll': p})
為了盡可能利用 Http404,你應(yīng)該創(chuàng)建一個(gè)用來在404錯(cuò)誤產(chǎn)生時(shí)展示的模板。這個(gè)模板應(yīng)該叫做404.html,并且在你的模板樹中位于最頂層。
如果你在拋出Http404異常時(shí)提供了一條消息,當(dāng)DEBUG為True時(shí)它會出現(xiàn)在標(biāo)準(zhǔn)404模板的展示中。你可以將這些消息用于調(diào)試;但他們通常不適用于404模板本身。
Django中默認(rèn)的錯(cuò)誤視圖對于大多數(shù)web應(yīng)用已經(jīng)足夠了,但是如果你需要任何自定義行為,重寫它很容易。只要在你的URLconf中指定下面的處理器(在其他任何地方設(shè)置它們不會有效)。
handler404覆蓋了page_not_found()視圖:
handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500覆蓋了server_error()視圖:
handler500 = 'mysite.views.my_custom_error_view'
handler403覆蓋了permission_denied()視圖:
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler400覆蓋了bad_request()視圖:
handler400 = 'mysite.views.my_custom_bad_request_view'