在Django开发中,我们经常会想通过类似于 raise Http404("Page not found.")
的代码来展示自定义404页面。
本文将实用地整理404错误的发生原因、模板连接方法,以及403/500错误的处理方式。
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. 自定义方法
必备条件
- 模板名称必须为
404.html
。 settings.py
中应设置以下项:DEBUG = False
- 设置
ALLOWED_HOSTS
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
路径下存在。 - 如有必要,可以手动注册
handler403
、handler400
、handler500
将其连接到特定视图。
总结整理
项目 | 内容 |
---|---|
raise Http404 使用时 |
自动渲染 404.html 模板 |
get_object_or_404() |
如果对象不存在则自动触发404 |
模板名称 | 必须使用 404.html 、403.html 等固定名称 |
目录条件 | 必须在 TEMPLATES['DIRS'] 或 APP_DIRS 内部 |
DEBUG条件 | 只有当 DEBUG = False 时用户模板才会生效 |
高级用法 | 可以通过 handler404 、handler500 等连接到特定视图 |
댓글이 없습니다.