Django 配置404和500页面

本文详述了在Django框架中如何自定义404和500错误页面,包括直接创建特定命名模板和设置句柄两种方法。同时,介绍了在DEBUG模式关闭后,如何解决静态文件404问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一、直接templates目录创建特定命名的模板文件

1、主配置文件settings.py中添加模板路径,关闭调试模式 DEBUG = False ,因为调试模式的错误页面是开发下会显示错误信息的,同时设置ALLOW_HOST。

设置后对于404或其他错误请求会显示默认的错误码页面,而不会再显示具体的代码错误了。但是默认的页面只有状态码。所以常常需要自己再写页面。

DEBUG = False
ALLOWED_HOSTS = [*]

2、在templates文件夹下创建404.html和500.html,如果使用这种直接放文件的方法,文件名是django已经规定好了的,不能是其他的名称。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ request_path }}
404
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
500
</body>
</html>

测试404和500请求
在这里插入图片描述
在这里插入图片描述

这是一种非常简单的方式。在项目模板文件夹 templates 中创建命名为 404.html 的模板文件即可。这个方式是其实是借用了 Django 的模板查找规则进行的。源码在 django.views.defaults.py 中,方法一不需要设路由,只要新建规定名称的模板就能生效了。

方法二、设置句柄

如果需要更个性化的错误页面,不需要拘泥于特定的模板文件名,可以重新设置句柄。

1、同样的需要先进行方法一的步骤修改setting.py配置及创建html文件

2、添加视图函数,可以添加在项目的views中,也可以另外创建一个python文件 或者直接写在urls中,在哪里不影响,只要能引用到就可以了。我这里是写在项目中了。

# 404
def page_not_found(request, exception):
    return render(request, '404.html')

# 500
def page_error(request):
    return render(request, '500.html')

2、在urls.py设置句柄

(1)可以用字符串直接引用函数,需要加上完整的地址项目文件和函数地址。

handler404="echarts.views.page_not_found"
handler500 = "echarts.views.page_error"

(2)也可以先引入再调用。

from echarts.views import *
handler404=page_not_found
handler500=page_error

3、同样可以访问
在这里插入图片描述
在这里插入图片描述

三、设置 DEBUG=False后静态文件404问题

  • 原因
    当我们在开发django应用时如果设置了 DEBUG = True,那么django便会自动帮我们对静态文件进行路由;但是当我们设置DEBUG = False后,这一功能便没有了,此时静态文件就会出现加载失败的情况,想要让静态文件正常显示,我们就需要配置静态文件服务了。

1、一种是使用文件服务器如nginx来实现:

location /static {
        expires 30d;
        autoindex on;
        add_header Cache-Control private;
        alias /root/myproject/static;
     }

此时我们在应用中加载静态文件的话就只需要这么来写了,以img加载为例:

<img src="/static/images/good.png" alt="My image"/>

具体的介绍和配置在之前的博客里有nginx+uwsgi+django部署,对这种方法这里就不多说了。

2、第二种就是设置django的文件服务的django.views.static.serve()方法

(1)修改setting.py

STATIC_URL = '/static/'

# 存放静态文件的目录,其中也可以包含url
STATICFILES_DIRS= [
    #os.path.join(BASE_DIR,'static'),
]

STATIC_ROOT = os.path.join(BASE_DIR, "static")   # 使用 collectstatic后收集的静态文件的存放绝对路径

(2)修改整个项目的urls.py

from django.conf import settings    ##新增
from django.views.static import serve   ##新增
urlpatterns = [
    re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}, name='static')  ##新增
]

(3)然后在终端执行命令把静态文件收集到 STATIC_ROOT中

python manage.py collectstatic

关于DEBUG模式和静态文件这里写的不是很详细,详细介绍在我另一篇博客里Django中DEBUG模式及static静态文件

参考:
Django 自定义 404 500 等错误页面
Django 配置404页面
Django 项目设置 Debug=False 后静态文件和上传文件404错误问题解决
详解django中的collectstatic命令以及STATIC_URL、STATIC_ROOT配置

<think>好的,我现在需要帮助用户了解Django中处理404错误的最佳实践。首先,我得回忆一下Django的文档相关的最佳实践,确保信息准确。 用户提到他们想处理404错误,所以首先应该想到Django的默认处理方式。默认情况下,Django会在调试模式下显示详细的404页面,但生产环境下需要自定义。我记得在Django中,处理404错误通常涉及到两个部分:视图模板,还有URL配置。 第一步,用户可能需要创建自定义的404模板。Django会自动查找特定的模板名称,比如404.html,放在项目的模板目录下。这时候需要确认模板的位置是否正确,并且是否配置了TEMPLATES设置中的DIRS,确保Django能找到这个模板。这部分需要检查settings.py中的设置,比如是否包含os.path.join(BASE_DIR, 'templates')这样的路径。 接下来是自定义的404视图。默认情况下,Django使用django.views.defaults.page_not_found来处理404错误,但用户可能需要覆盖这个行为。例如,他们可能想记录404错误或者传递额外的上下文到模板。这时候需要修改根URLs.py,设置handler404指向自定义的视图函数。记得这个handler404需要放在根URLconf中,而不是在某个应用的URL配置里。 然后是日志记录的问题。用户可能希望每次出现404错误时记录下来,便于后续分析。这时候可以利用Django的日志配置,在settings.py中添加一个logger,专门处理404请求。需要引用LOGGING的配置,可能添加一个文件处理器或者邮件通知,比如使用SMTPHandler,当404错误频繁出现时通知管理员。这里需要参考引用中的例子,比如引用[3]提到的AdminEmailHandler,但可能调整级别为WARNING或者INFO,而不是ERROR,因为404属于客户端错误,但具体情况要看需求。 另外,用户可能需要处理静态文件媒体文件的404情况。例如,当DEBUG为False时,Django不处理静态文件,所以需要配置Web服务器(如Nginx或Apache)来处理这些文件的404错误,而不是Django本身。这部分可能需要提醒用户在生产环境中正确配置静态文件,避免Django处理静态请求。 还要提到中间件的使用,比如CommonMiddleware,它默认会检查APPEND_SLASHPREPEND_WWW的设置,这些可能会影响404的产生。例如,如果APPEND_SLASH为True,Django会尝试为没有斜杠的URL添加斜杠,如果失败才会返回404。因此,用户需要确保这些中间件配置正确。 测试404页面也是重要的。用户可能需要在视图中手动引发Http404异常,或者在测试中使用client.get不存在的URL来检查是否正确返回自定义页面。这部分需要指导用户如何编写测试用例,确保自定义处理正常工作。 可能还需要提到国际化的问题,如果网站支持多语言,404模板可能需要根据语言切换不同的显示内容。这时候可以利用Django的i18n框架,在模板中使用{% trans %}标签或者根据请求的LANGUAGE_CODE动态显示信息。 最后,总结最佳实践步骤:创建模板、配置视图、设置日志、处理静态文件、测试中间件配置。确保所有步骤都覆盖,并且引用相关的文档或最佳实践,比如引用[2]提到的项目结构,可能404模板应该放在全局的templates目录下,而不是某个应用内部。同时,引用[3]中的日志配置示例可以作为参考,调整适用于404的日志记录。</think>### Django 处理 404 错误的最佳实践 在 Django 中处理 404 错误的核心目标是提供友好的用户界面、记录错误信息,并确保生产环境的安全性。以下是具体步骤最佳实践: --- #### 1. **自定义 404 模板** Django 默认会查找名为 `404.html` 的模板文件。将其放置在项目的全局模板目录(如 `templates/`)中,确保 `settings.py` 已正确配置模板路径: ```python # settings.py TEMPLATES = [ { 'DIRS': [os.path.join(BASE_DIR, 'templates')], # ... }, ] ``` 模板示例: ```html <!-- templates/404.html --> <h1>页面未找到</h1> <p>请求的 URL {{ request.path }} 不存在,请检查地址是否正确。</p> ``` --- #### 2. **配置自定义 404 视图** 在根 URL 配置(`urls.py`)中定义 `handler404`,指向自定义视图函数: ```python # urls.py (项目根目录) from django.urls import path from .views import custom_page_not_found handler404 = custom_page_not_found urlpatterns = [ # 其他路由... ] ``` 视图函数示例(可添加日志记录): ```python # views.py from django.shortcuts import render from django.http import Http404 def custom_page_not_found(request, exception): # 记录错误日志 logger.warning(f"404 错误: {request.path}") return render(request, '404.html', status=404) ``` --- #### 3. **启用日志记录** 在 `settings.py` 中配置日志,记录 404 错误信息[^3]: ```python # settings.py LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'class': 'logging.FileHandler', 'filename': 'logs/404_errors.log', 'level': 'WARNING', }, }, 'loggers': { 'django.request': { 'handlers': ['file'], 'level': 'WARNING', 'propagate': False, }, }, } ``` --- #### 4. **生产环境配置** - **关闭调试模式**:确保 `DEBUG = False`,否则 Django 会显示默认调试页面。 - **处理静态文件**:通过 Web 服务器(如 Nginx)直接处理静态文件请求,避免 Django 处理无效路径[^2]。 --- #### 5. **测试 404 页面** - **手动测试**:访问不存在的 URL(如 `/invalid-path/`)。 - **单元测试**: ```python from django.test import TestCase class ErrorPageTest(TestCase): def test_404_page(self): response = self.client.get('/non-existent-url/') self.assertEqual(response.status_code, 404) self.assertTemplateUsed(response, '404.html') ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值