10.Django_抛出404错误

本文介绍了如何在Django中优雅地抛出404错误,强调了保持模型层和视图层松散耦合的重要性。通过使用get_object_or_404和get_list_or_404辅助函数,可以在对象不存在或查询列表为空时触发Http404错误。此外,还详细说明了自定义404错误页面的步骤,包括在views.py中添加视图处理和创建定制的HTML错误文件。

四、抛出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等页面文件即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值