內建視圖¶
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_denied
由 PermissionDenied
異常觸發。若要在視圖中拒絕存取權,您可以使用如下的程式碼:
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,表示錯誤條件是用戶端操作的結果。預設情況下,不會將任何與觸發視圖的異常相關的資訊傳遞給範本內容,因為異常訊息可能包含敏感資訊,例如檔案系統路徑。
只有當 DEBUG
為 False
時,才會使用 bad_request
視圖。