自定义页面 404 未显示,但页面 500 正在显示

Posted

技术标签:

【中文标题】自定义页面 404 未显示,但页面 500 正在显示【英文标题】:The custom page 404 is not showing but the page 500 is showing 【发布时间】:2018-05-28 11:14:22 【问题描述】:

当我加载一个不存在的 url 时,页面 404 不显示,而是显示页面 500。在我的设置下方。 您能否指导我打开 Django 以显示 404 页面?谢谢

Ubuntu 服务器 16.04 ;蟒蛇3.5.2; Django 2.0

cat contatoproj/urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from django.conf.urls import include
from django.conf.urls import handler404, handler500
from contatoapp import views
from contatoapp import views as myapp_views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.index, name='index'),
    url(r'^contato', views.contato, name='contato'),
]

handler404 = myapp_views.error_404
handler500 = myapp_views.error_500

cat contatoapp/views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.template import RequestContext
from django.contrib import messages
from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect
from django.conf import settings
from contatoapp.forms import ContatoForm

def error_404(request):
    data = 
    return render(request, 'ops404.html', data)

def error_500(request):
    data = 
    return render(request, 'ops500.html', data)

$ ls -la 模板/操作*

-rwxr-xr-x 1 admweb admweb 614 Dec 13 15:31 templates/ops404.html
-rwxr-xr-x 1 admweb admweb 614 Dec 13 15:29 templates/ops500.html

cat contatoproj/settings.py

DEBUG = False
ALLOWED_HOSTS = ['*']

【问题讨论】:

【参考方案1】:

如果您因缺少页面而收到 500 错误,那是因为 Django 尝试处理该响应时发生了错误。

通过查看您的代码,这可能是因为您的 404 错误处理程序定义错误 - 它需要接受第二个缺少的 exception 参数。将其更改为:

def error_404(request, exception):
    data = 
    return render(request, 'ops404.html', data)

还请注意,您应该返回HttpResponseNotFound,否则客户端将不会收到 HTTP 404 响应。

【讨论】:

【参考方案2】:

您在处理 404 的过程中遇到错误。这意味着您将获得 500。

由于您在 500 或 404 视图中没有做任何特别的事情,因此您不需要使用 handler404/500 为它们显式定义处理程序视图。

相反,您应该在模板目录中定义404.html500.html。 Django 将使用这些而不是默认模板,您无需重新正确实现 404 和 500 视图。

【讨论】:

这是正确答案。实施 404 和 500 处理程序仅适用于非常专业的用例。

以上是关于自定义页面 404 未显示,但页面 500 正在显示的主要内容,如果未能解决你的问题,请参考以下文章

Django 404页面未加载

Django 自定义 500 错误模板不显示 request.user

Django自定义404500等页面模板

MVC4 中的自定义 403 错误页面未显示

如何使用静态文件在开发服务器上测试自定义 404 和 500 页面?

Spring Security 未路由到自定义登录页面 404 错误