四、拋出404錯誤
如果訪問的資源不存在的話,我們想拋出404錯誤,而不是暴露Django的錯誤信息。Django爲我們提供了這樣一個方法
-
get_object_or_404()
:將一個Django模型作爲第一個位置參數,後面可以跟上任意個數的關鍵字參數,如果對象不存在則彈出Http404錯誤。 -
爲什麼我們使用輔助函數
get_object_or_404()
而不是自己捕獲ObjectDoesNotExist
異常呢?還有,爲什麼模型API不直接拋出ObjectDoesNotExist
而是拋出Http404
呢?
因爲這樣做會增加模型層和視圖層的耦合性。而Django
的設計思想中,最重要的思想之一就是要保證鬆散耦合。一些受控的耦合將會被包含在 django.shortcuts
模塊中。
例子:當id不存在時,拋出404
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
-
還有一個
get_list_or_404()
方法
和get_object_or_404()
類似,只不過是用來替代filter()
函數,當查詢列表爲空時彈出404錯誤。(filter()
是模型API中用來過濾查詢結果的函數,它的結果是一個列表集。而get則是查詢一個結果的方法,和filter是一個和多個的區別) -
當然,因爲自帶的404等頁面太醜,一般都是自定義404、500等頁面;
1.urls.py
:
from django.contrib import admin
from django.urls import path
from app import views
urlpatterns = [
path('admin/', admin.site.urls),
]
# 增加的條目
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.error
2.在應用/views.py文件增加對應的處理視圖:
def bad_request(request):
return render(request, '400.html')
def permission_denied(request):
return render(request, '403.html')
def page_not_found(request):
return render(request, '404.html')
def error(request):
return render(request, '500.html')