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

时间:2017-12-14 11:20:43

标签: python django

当我加载不存在的URL时,页面404不显示,而是显示页面500。在我的设置下面。 你能不能引导我将Django打开以显示404页面?感谢

Ubuntu Server 16.04; Python 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 templates / ops *

-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 = ['*']

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

您在处理404时遇到错误。这意味着您将获得500.

由于您在500或404视图中没有做任何特殊操作,因此您无需使用handler404/500为它们显式定义处理程序视图。

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