在Django开发中,我们经常会想通过类似于 raise Http404("Page not found.") 的代码来展示自定义404页面。
本文将实用地整理404错误的发生原因模板连接方法,以及403/500错误的处理方式

Django自定义404错误页面插图


1. 触发404错误的常见方法

我们分类了Django中触发404错误的情况,可能有下面四种吧。

1. raise Http404("说明")

直接显式触发404错误的最基本方法。

from django.http import Http404

def my_view(request):
    if not condition:
        raise Http404("Page not found.")

2. get_object_or_404()

Django中常用的快捷函数。如果对象不存在,则自动触发404。

from django.shortcuts import get_object_or_404

post = get_object_or_404(Post, pk=pk)

3. 使用 Model.objects.get() 后进行异常处理

在这种情况下,也需要手动触发404。

from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist

try:
    post = Post.objects.get(pk=pk)
except ObjectDoesNotExist:
    raise Http404("Post not found.")

4. 当URLConf或视图不存在时

与1~3不同,这并不是开发者故意触发的404,但如果请求者访问不存在的URL,Django将内部自动触发404。


2. 自定义方法

必备条件

  1. 模板名称必须为 404.html
  2. settings.py中应设置以下项:
  3. DEBUG = False
  4. 设置 ALLOWED_HOSTS
  5. 404.html 模板必须位于Django可以找到的位置。

模板位置

位置 说明
项目根目录/templates/404.html 最常见且稳定的位置
应用名/templates/404.html 可以,但需要 APP_DIRS = True 条件
应用名/templates/应用名/errors/404.html 不会被自动识别,需要设置handler404

handler404 手动连接示例

# views.py
def custom_404_view(request, exception):
    return render(request, 'myapp/errors/404.html', status=404)

# urls.py
handler404 = 'myapp.views.custom_404_view'

3. 403, 500错误也可以自定义吗?

✔ Django除了404外,还可以通过模板自定义以下错误页面:

错误代码 默认模板名称 说明
403 403.html 权限不足 (Permission Denied)
404 404.html 找不到页面 (Not Found)
500 500.html 服务器内部错误 (Internal Server Error)
400 400.html 错误请求 (Bad Request)

✔ 基本条件相同

  • 必须是 DEBUG = False才能应用模板。
  • 模板必须在 TEMPLATES['DIRS']APP_DIRS=True 路径下存在。
  • 如有必要,可以手动注册 handler403handler400handler500 将其连接到特定视图。

总结整理

项目 内容
raise Http404 使用时 自动渲染 404.html 模板
get_object_or_404() 如果对象不存在则自动触发404
模板名称 必须使用 404.html403.html 等固定名称
目录条件 必须在 TEMPLATES['DIRS']APP_DIRS 内部
DEBUG条件 只有当 DEBUG = False 时用户模板才会生效
高级用法 可以通过 handler404handler500等连接到特定视图