天天看點

django 1.8 官方文檔翻譯: 3-1-2 編寫視圖編寫視圖

Django 文檔協作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質。

交流群:467338606

網站:

http://python.usyiyi.cn/django/index.html

編寫視圖

一個視圖函數,或者簡短來說叫做視圖,是一個簡單的Python函數,它接受web請求,并且傳回web響應。響應可以是一張網頁的HTML内容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖檔… 是任何東西都可以。無論視圖本身包含什麼邏輯,都要傳回響應。代碼寫在哪裡也無所謂,隻要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什麼神奇的地方”。為了能夠把代碼放在某個地方,慣例是把視圖放在叫做views.py的檔案中,然後把它放到你的項目或者應用目錄裡。

一個簡單的視圖

下面是一個傳回目前日期和時間作為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.http子產品導入了HttpResponse類,以及Python的datetime庫。
  • 接着,我們定義了current_datetime函數。它是一個視圖函數。每個視圖函數都應接收HttpRequest對象作為第一個參數,一般叫做request。
  • 注意視圖函數的名稱并不重要;不需要用一個統一的命名方式來命名,以便讓Django識别它。我們将其命名為current_datetime,是因為這個名稱能夠精确地反映出它的功能。
  • 這個視圖會傳回一個HttpResponse對象,其中包含生成的響應。每個視圖函數都要傳回HttpResponse對象。(有例外,我們接下來會講。)

Django中的時區

Django中包含一個TIME_ZONE設定,預設為America/Chicago。可能并不是你住的地方,是以你可能會在設定檔案裡修改它。

把你的URL映射到視圖

是以,再重複一遍,這個視圖函數傳回了一個包含目前日期和時間的HTML頁面。你需要建立URLconf來展示在特定的URL這一視圖; 詳見URL 分發器。

傳回錯誤

在Django中傳回HTTP錯誤是相當容易的。有一些HttpResponse的子類代表不是200(“OK”)的HTTP狀态碼。你可以在request/response文檔中找到所有可用的子類。你可以傳回那些子類的一個執行個體,而不是普通的HttpResponse ,來表示一個錯誤。例如:

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>')           

由于一些狀态碼不太常用,是以不是每個狀态碼都有一個特化的子類。然而,如HttpResponse文檔中所說的那樣,你也可以向HttpResponse的構造器傳遞HTTP狀态碼,來建立你想要的任何狀态碼的傳回類。例如:

from django.http import HttpResponse

def my_view(request):
    # ...

    # Return a "created" (201) response code.
    return HttpResponse(status=201)           

由于404錯誤是最常見的HTTP錯誤,是以處理這一錯誤的方式非常便利。

Http404異常

class django.http.Http404

當你傳回一個像HttpResponseNotFound這樣的錯誤時,它會輸出這個錯誤頁面的HTML作為結果:

return HttpResponseNotFound('<h1>Page not found</h1>')           

為了便利起見,也因為你的站點有個一緻的404頁面是個好主意,Django提供了Http404異常。如果你在視圖函數中的任何地方抛出Http404異常,Django都會捕獲它,并且帶上HTTP404錯誤碼傳回你應用的标準錯誤頁面。

像這樣:

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,你應該建立一個用來在404錯誤産生時展示的模闆。這個模闆應該叫做404.html,并且在你的模闆樹中位于最頂層。

如果你在抛出Http404異常時提供了一條消息,當DEBUG為True時它會出現在标準404模闆的展示中。你可以将這些消息用于調試;但他們通常不适用于404模闆本身。

自定義錯誤視圖

Django中預設的錯誤視圖對于大多數web應用已經足夠了,但是如果你需要任何自定義行為,重寫它很容易。隻要在你的URLconf中指定下面的處理器(在其他任何地方設定它們不會有效)。

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'