如何在django中正确设置自定义handler404?

时间:2016-02-02 14:29:35

标签: django http-status-code-404

根据documentation,这应该相当简单:我只需要定义urls.py。目前我正在我的顶级urlpatterns = [ ... ] handler404 = 'myapp.views.handle_page_not_found'

def handle_page_not_found(request):
    return redirect('homepage')

已安装该应用程序。相应的视图只是(目前我只想在404的情况下重定向到主页):

404

但这没有效果:显示标准(调试)handler404页面。

文档有点含糊不清:

  • 应该在哪里定义URLconf?文档在urls.py中说明,但究竟在哪里?我有几个应用程序,每个都有不同的URLconf。我能把它放进去吗?在顶部django.http.Http404?为什么?这在哪里记录?
  • 这个处理程序会捕获什么?它会抓住django.http.HttpResponseNotFounddjango.http.HttpResponsestatus=404//span[@class='fc-title'][.='Holiday4'] )吗?

4 个答案:

答案 0 :(得分:8)

正如我们所讨论的,您的设置是正确的,但在settings.py中,您应该DEBUG=False。它更像是一个生产功能,并且在开发环境中不起作用(除非你在开发机器中有DEBUG=False)。

答案 1 :(得分:3)

调试应为 False 并添加到视图*args**kwargs。添加到urls.py handler404 = 'view_404'

def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')

如果我不添加args,则kwargs服务器将获得500。

答案 2 :(得分:2)

所有其他答案都不是最新的。这是在Django 3.1中对我有用的东西:

urls.py

from django.conf.urls import handler404, handler500, handler403, handler400
from your_app_name import views

handler404 = views.error_404
handler500 = views.error_500

views.py

def error_404(request, exception):
   context = {}
   return render(request,'admin/404.html', context)

def error_500(request):
   context = {}
   return render(request,'admin/500.html', context)

注意,您将必须编辑此代码以在urls.py的import语句中反映您的应用名称,并在views.py中反映html模板的路径。

答案 3 :(得分:1)

要在自定义页面上呈现 404错误响应,请执行以下操作:

在您的项目目录中,打开settings.py并按如下所示修改DEBUG

    DEBUG = False

在同一目录中创建一个文件并将其命名为views.py,并插入以下代码:

   from django.shortcuts import render

   def handler404(request, exception):
       return render(request, 'shop/shop.html')

最后打开同一项目目录中的urls.py文件,并添加以下代码:

   from django.contrib import admin
   from . import views

   handler404 = views.handler404

   urlpatterns = [
      path('admin/', admin.site.urls),
   ]