Django 2.1.3 視圖層 視圖函數

模型層 | 總目錄 | 快捷函數


視圖函數或簡稱視圖 只是一個Python函數,它接受Web請求並返回Web響應。此響應可以是HTML網頁的內容,重定向,404錯誤,XML文檔或圖像,或者其他什麼。視圖本身包含返回該響應所需的任意邏輯。這段代碼可以存在於任何你想要的地方,只要它在你的Python路徑上。沒有其他要求 - 可以這麼說。爲了將代碼放在某處,慣例是將視圖放在一個名爲views.py的文件中。

1.一個簡單的視圖

這是一個返回當前日期和時間的視圖,以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)

讓我們逐行分析此代碼:

1 . 首先,我們從 django.http模塊中導入HttpResponse類,以及Python的datetime庫。

2 . 接下來,我們定義一個名爲current_datetime的函數,這是視圖視圖。每個視圖函數都將一個HttpRequest 對象作爲其第一個參數,通常將其命名爲 request。

請注意,視圖函數的名稱無關緊要; 它不必以某種方式命名,以便Django識別它。我們把它命名爲current_datetime,因爲這個名字清楚地表明瞭它的作用。

3 . 視圖返回包含生成響應(HttpResponse)的對象。每個視圖函數負責返回一個HttpResponse對象。(也有例外,但我們稍後會介紹。)

Django的時區
Django默認設置TIME_ZONEAmerica/Chicago。這可能不是您居住的地方,因此您可能希望在設置文件中更改它。

2. 將URL映射到視圖

因此,回顧一下,這個視圖函數返回一個包含當前日期和時間的HTML頁面。要在特定URL上顯示此視圖,您需要創建一個 URLconf ; 有關說明,請參閱URL調度器

3. 返回錯誤

在Django中返回HTTP錯誤代碼很容易。除了200(表示“OK”)之外,還有許多常見HTTP狀態代碼的HttpResponse子類 。您可以在請求/響應 文檔中找到可用子類的完整列表。只需返回其中一個子類的實例而不是正常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>')

不是所有的HTTP響應代碼都有專門的子類,因爲它們中的許多都不會那麼常見。但是,如HttpResponse文檔中所述,您還可以將HTTP狀態代碼傳遞給構造函數, 以便爲您喜歡的任何狀態代碼創建返回類。例如:

from django.http import HttpResponse

def my_view(request):
    # ...

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

因爲404錯誤是迄今爲止最常見的HTTP錯誤,所以有一種更簡單的方法來處理這些錯誤。

3.1 Http404異常

class django.http.Http404

當您返回錯誤,如 HttpResponseNotFound,您負責定義生成錯誤頁面的HTML:

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

爲方便起見,並且因爲在您的站點上有一個一致的404錯誤頁面是個好主意,Django提供了一個 Http404 異常。如果Http404異常在視圖函數中的任何一處被拋出 ,Django將捕獲它並返回你的應用程序的標準錯誤頁面,以及HTTP錯誤代碼404。

用法示例:

from django.http import Http404
from django.shortcuts import render
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(request, 'polls/detail.html', {'poll': p})

爲了在Django返回404時顯示自定義HTML,您可以創建一個名爲 404.html 的HTML模板,並將其放在模板樹的頂層。當DEBUG=False這個404模板將會成爲一個全局的404頁面。
在這裏插入圖片描述
如果DEBUG=True,你可以提供一個消息Http404,它會出現在標準404調試模板(系統的404模板)。使用這些消息進行調試; 它們通常不適合用於生產的404模板。

4. 自定義錯誤視圖

Django中的默認錯誤視圖應該足以滿足大多數Web應用程序的需要,但如果您需要任何自定義行爲,則可以輕鬆覆蓋它們。只需在URLconf中指定處理程序,如下所示(在其他地方設置它們將無效)。

page_not_found()視圖由handler404重寫:

handler404 = 'mysite.views.my_custom_page_not_found_view'

server_error()視圖由handler500重寫:

handler500 = 'mysite.views.my_custom_error_view'

permission_denied()視圖由handler403重寫:

handler403 = 'mysite.views.my_custom_permission_denied_view'

bad_request()視圖由handler400重寫 :

handler400 = 'mysite.views.my_custom_bad_request_view'

參見
使用設置文件中的CSRF_FAILURE_VIEW覆蓋CSRF錯誤視圖。

4.1測試自定義錯誤視圖

要測試自定義錯誤處理程序的響應,請在測試視圖中引發相應的異常。例如:

# 一個視圖文件中
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse

def response_error_handler(request, exception=None):
    return HttpResponse('Error handler content', status=403)


def permission_denied_view(request):
    raise PermissionDenied

# app的urls.py文件中,
urlpatterns = [
    path('403/', permission_denied_view),
]
# 全局的urls.py文件中
handler403 = response_error_handler

在這裏插入圖片描述
在你的測試程序中,要這麼寫TestCase:

from django.test import SimpleTestCase, override_settings
# ROOT_URLCONF must specify the module that contains handler403 = ...
@override_settings(ROOT_URLCONF=__name__)
class CustomErrorHandlerTests(SimpleTestCase):

    def test_handler_renders_template_response(self):
        response = self.client.get('/403/')
        # Make assertions on the response here. For example:
        self.assertContains(response, 'Error handler content', status_code=403)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章