10.Django_拋出404錯誤

四、拋出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')

3.在對應位置創建400.html等頁面文件即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章