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

dan*_*ast 14 django http-status-code-404

根据文档,这应该是相当简单的:我只需要定义handler404.目前我在做,在我的顶部urls.py:

urlpatterns = [
    ...
]

handler404 = 'myapp.views.handle_page_not_found'
Run Code Online (Sandbox Code Playgroud)

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

def handle_page_not_found(request):
    return redirect('homepage')
Run Code Online (Sandbox Code Playgroud)

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

文档有点含糊不清:

  • 应该handler404在哪里定义?文件说URLconf但是,究竟在哪里?我有几个应用程序,每个都有不同的urls.py.我能把它放进去吗?在顶部URLconf?为什么?这记录在哪里?
  • 这个处理程序会捕获什么?它可以捉住django.http.Http404, django.http.HttpResponseNotFound,django.http.HttpResponse(用status=404)?

Sha*_*ang 10

正如我们所讨论的,您的设置是正确的,但在settings.py中您应该这样做DEBUG=False.它更像是一个生产功能,不能在开发环境中工作(除非你DEBUG=False当然是在dev机器中).

  • 我在开发模式下将我的变为'False`,仍然默认django错误页面显示. (3认同)

Pas*_*Mok 8

Debug应该为False并添加到view *args和中**kwargs。添加到urls.pyhandler404 = 'view_404'

def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')
Run Code Online (Sandbox Code Playgroud)

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


dev*_*drc 7

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

网址.py

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

handler404 = views.error_404
handler500 = views.error_500
Run Code Online (Sandbox Code Playgroud)

视图.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)
Run Code Online (Sandbox Code Playgroud)

请注意,您必须编辑此代码以在 urls.py 中的导入语句中反映您的应用程序名称以及在 views.py 中的 html 模板路径。


Gil*_*rtS 6

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

在你的项目目录中打开settings.py并修改DEBUG如下:

    DEBUG = False
Run Code Online (Sandbox Code Playgroud)

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

   from django.shortcuts import render

   def handler404(request, exception):
       return render(request, 'shop/shop.html')
Run Code Online (Sandbox Code Playgroud)

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

   from django.contrib import admin
   from . import views

   handler404 = views.handler404

   urlpatterns = [
      path('admin/', admin.site.urls),
   ]
Run Code Online (Sandbox Code Playgroud)