如何在django中有意返回404页

如何在django中有意返回404页,django,Django,我用django定制了404页面。我想故意得到404错误页面 myproject/url.py: from website.views import customhandler404, customhandler500, test urlpatterns = [ re_path(r'^admin/', admin.site.urls), re_path(r'^test/$', test, name='test'), ] handler404 = customhandler404

我用django定制了404页面。我想故意得到404错误页面

myproject/url.py:

from website.views import customhandler404, customhandler500, test

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^test/$', test, name='test'),
]
handler404 = customhandler404
handler500 = customhandler500
网站/视图.py

def customhandler404(request):
    response = render(request, '404.html',)
    response.status_code = 404
    return response


def customhandler500(request):
    response = render(request, '500.html',)
    response.status_code = 500
    return response

def test(request):
    raise Http404('hello')
但当我转到127.0.0.1:8000/test/时,它似乎返回
500.html

终端说:

[24/Mar/2018 22:32:17]“GET/test/HTTP/1.1”500 128


如何有意获取404页面?

当您将debug设置为False时,您没有自定义处理程序,并且响应的状态代码为404,将使用基本模板目录中的404.html(如果存在)。要返回404状态的响应,只需返回
django.http.HttpResponseNotFound
的实例即可。您得到500的原因是您引发了一个错误,而不是返回响应。因此,您的测试函数可以简单地修改为

from django.http import HttpResponseNotFound
def test(request):
    return HttpResponseNotFound("hello")         
更新:

from website.views import customhandler404, customhandler500, test

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^test/$', test, name='test'),
]
handler404 = customhandler404
handler500 = customhandler500
结果表明,出现500错误的原因不是引发了异常,而是函数签名不正确。当我半年多前回答这个问题时,我忘记了django为您捕获了HTTP404异常。但是,处理程序视图与普通视图具有不同的签名。404的默认处理程序是
defaults.page\u not\u found(请求、异常、模板\u name='404.html')
,它包含3个参数。因此,您的自定义处理程序实际上应该是

def customhandler404(request, exception, template_name='404.html'):
    response = render(request, template_name)
    response.status_code = 404
    return response

尽管在这种情况下,您也可以使用默认处理程序。

如果查看日志/管理员电子邮件或启用调试,回溯应该会告诉您错误的原因。也许您忘记了从django.http import Http404导入
。请注意,默认的404和500处理程序将分别呈现
404.html
500.html
模板,因此您可以删除自定义处理程序。不建议对500页使用
render
,因为当它试图呈现
500.html
模板时,错误可能会重复。我刚刚编辑了我的答案,希望它对您仍然有用。关于
httpresponseontfound
通常最好提出。这样,您只需定义一次模板(
404.html
,除非被覆盖)。