內建視圖

Django 的幾個內建視圖在撰寫視圖以及文件中的其他地方都有說明。

在開發中提供檔案

static.serve(request, path, document_root, show_indexes=False)

除了專案的靜態資源之外,可能還有一些檔案,為了方便起見,您希望 Django 在本地開發時為您提供服務。serve() 視圖可用於提供您給它的任何目錄。(此視圖**不**適合用於生產環境,應僅用作開發輔助工具;您應該在生產環境中使用真正的前端網路伺服器提供這些檔案)。

最常見的範例是 MEDIA_ROOT 中使用者上傳的內容。django.contrib.staticfiles 用於靜態資源,並且沒有內建處理使用者上傳檔案的功能,但是您可以通過將類似以下的內容附加到您的 URLconf 來讓 Django 提供您的 MEDIA_ROOT

from django.conf import settings
from django.urls import re_path
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        re_path(
            r"^media/(?P<path>.*)$",
            serve,
            {
                "document_root": settings.MEDIA_ROOT,
            },
        ),
    ]

請注意,此程式碼片段假設您的 MEDIA_URL 的值為 'media/'。這將呼叫 serve() 視圖,並傳入 URLconf 中的路徑以及(必需的)document_root 參數。

由於定義此 URL 模式可能會變得有些麻煩,因此 Django 提供了一個小的 URL 輔助函數 static(),它將前綴(例如 MEDIA_URL)和視圖的點狀路徑(例如 'django.views.static.serve')作為參數。任何其他函數參數都將透明地傳遞給視圖。

錯誤視圖

Django 預設帶有一些視圖來處理 HTTP 錯誤。若要使用您自己的自訂視圖覆寫這些視圖,請參閱自訂錯誤視圖

404(找不到頁面)視圖

defaults.page_not_found(request, exception, template_name='404.html')

當您從視圖中引發 Http404 時,Django 會載入專用於處理 404 錯誤的特殊視圖。預設情況下,它是 django.views.defaults.page_not_found() 視圖,它會產生「找不到」訊息,或者在您在根範本目錄中建立 404.html 範本時載入並轉譯該範本。

預設 404 視圖會將兩個變數傳遞給範本:request_path,它是導致錯誤的 URL;以及 exception,它是觸發視圖的異常的實用表示形式(例如,包含傳遞給特定 Http404 執行個體的任何訊息)。

關於 404 視圖,有三件事需要注意

  • 如果在 URLconf 中檢查每個正規表示式之後,Django 沒有找到相符項目,也會呼叫 404 視圖。

  • 404 視圖會傳遞一個 RequestContext,並且可以存取您的範本內容處理器提供的變數(例如,MEDIA_URL)。

  • 如果 DEBUG 設定為 True(在您的設定模組中),則永遠不會使用您的 404 視圖,而是會顯示您的 URLconf 以及一些除錯資訊。

500(伺服器錯誤)視圖

defaults.server_error(request, template_name='500.html')

同樣地,如果視圖程式碼中發生執行階段錯誤,Django 會執行特殊情況的行為。如果視圖導致異常,Django 預設會呼叫 django.views.defaults.server_error 視圖,它會產生「伺服器錯誤」訊息,或者在您在根範本目錄中建立 500.html 範本時載入並轉譯該範本。

預設 500 視圖不會將任何變數傳遞給 500.html 範本,並且會以空的 Context 轉譯,以減少發生其他錯誤的機會。

如果 DEBUG 設定為 True(在您的設定模組中),則永遠不會使用您的 500 視圖,而是會顯示追溯資訊以及一些除錯資訊。

403 (HTTP 禁止) 視圖

defaults.permission_denied(request, exception, template_name='403.html')

與 404 和 500 視圖相同,Django 有一個視圖來處理 403 禁止錯誤。如果視圖導致 403 異常,則 Django 預設會呼叫 django.views.defaults.permission_denied 視圖。

此視圖會載入並轉譯您根範本目錄中的 403.html 範本,如果此檔案不存在,則會根據RFC 9110 第 15.5.4 節 (HTTP 1.1 規格) 改為提供「403 Forbidden」文字。範本內容包含 exception,它是觸發視圖的異常的字串表示形式。

django.views.defaults.permission_deniedPermissionDenied 異常觸發。若要在視圖中拒絕存取權,您可以使用如下的程式碼:

from django.core.exceptions import PermissionDenied


def edit(request, pk):
    if not request.user.is_staff:
        raise PermissionDenied
    # ...

400(錯誤請求)視圖

defaults.bad_request(request, exception, template_name='400.html')

當 Django 中引發 SuspiciousOperation 時,它可能會由 Django 的元件處理(例如重設會話資料)。如果未特別處理,Django 會將目前的請求視為「錯誤請求」,而不是伺服器錯誤。

django.views.defaults.bad_request 在其他方面與 server_error 視圖非常相似,但會傳回狀態碼 400,表示錯誤條件是用戶端操作的結果。預設情況下,不會將任何與觸發視圖的異常相關的資訊傳遞給範本內容,因為異常訊息可能包含敏感資訊,例如檔案系統路徑。

只有當 DEBUGFalse 時,才會使用 bad_request 視圖。

回到頂端