我在django中制作了自定义404页面。而且我试图故意获得404错误页面。
的myproject / urls.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
网站/ views.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页面?
答案 0 :(得分:14)
当您将debug设置为False时,您没有自定义处理程序,并且响应的状态代码为404,则使用基本模板目录中的404.html(如果存在)。要返回404状态的响应,您只需返回django.http.HttpResponseNotFound
的实例即可。你得到500的原因是因为你引发了错误而不是返回响应。因此,您的测试功能可以简单地修改为此
from django.http import HttpResponseNotFound
def test(request):
return HttpResponseNotFound("hello")
<强>更新强>
因此事实证明,您获得500错误的原因并不是您引发了异常,而是具有不正确的功能签名。当我在半年多前回答这个问题时,我忘记了django为你捕获了HTTP404异常。但是,处理程序视图具有与普通视图不同的签名。 404的默认处理程序是defaults.page_not_found(request, exception, template_name='404.html')
,它有3个参数。所以你的自定义处理程序实际应该是
def customhandler404(request, exception, template_name='404.html'):
response = render(request, template_name)
response.status_code = 404
return response
虽然在这种情况下,您也可以使用默认处理程序。