【问题标题】:How to properly setup custom handler404 in django?如何在 django 中正确设置自定义 handler404?
【发布时间】:2016-05-11 09:58:11
【问题描述】:

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

urlpatterns = [
    ...
]

handler404 = 'myapp.views.handle_page_not_found'

应用程序已安装。对应的视图就是(暂时只想重定向到首页以防404的情况):

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

但这没有任何效果:标准(调试)404 页面已显示。

文档有点含糊:

  • 应该在哪里定义handler404?文档在URLconf 中说,但是,到底在哪里?我有几个应用程序,每个应用程序都有不同的urls.py。我可以把它放在其中的任何一个中吗?在顶部URLconf?为什么?这是在哪里记录的?
  • 这个处理程序会捕获什么?它会捕获django.http.Http404django.http.HttpResponseNotFounddjango.http.HttpResponse(与status=404)吗?

【问题讨论】:

  • 您的设置中的DEBUG 是什么?如果是True,能不能换成False看看?
  • @ShangWang:谢谢!事实上,将其设置为False 可以解决问题。这没有记录,afaik。
  • @delavnog - 在 error reporting sections 中 - “当 DEBUG 为 False 时,...”
  • @Sayse:在完全不同的上下文中(电子邮件报告,...),与错误处理程序无关。在相应的段落中提及这一点会更有意义,但我离题了......
  • @delavnog - 我只是更多地指出它确实提到它在那里提到它,它在debug 的设置部分下暗示它如何处理错误页面,并且有很多其他引用DEBUG :)

标签: django http-status-code-404


【解决方案1】:

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

【讨论】:

  • 我在开发模式下将我的更改为False,但仍然显示默认的django错误页面。
【解决方案2】:

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

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

如果我没有添加 args 和 kwargs server 得到 500。

【讨论】:

    【解决方案3】:

    所有其他答案都不是最新的。以下是在 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 中的导入语句中反映您的应用名称,并在 views.py 中反映您的 html 模板的路径。

    【讨论】:

    • 如果你有一个 TemplateView? index_view = never_cache(TemplateView.as_view(template_name='index.html')) 为什么你不能在 error_404 函数里面做 return index
    • @realnot - 也许你可以。你试过了吗?解决问题的方法通常不止一种。
    • 我解决了。 def error_404(request, exception): return index_view(request)index_view 是一个返回模板响应的模板,你必须传递一个请求。 +1 为您的建议。是正确的!
    • urls.py 中将handler404 = views.error_404 更改为urls.handler404 = views.error_404 并导入网址如下from django.conf import urls
    • @HajrasElGdiryHG 更明确一点?
    【解决方案4】:

    要在自定义页面上呈现 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),
       ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      相关资源
      最近更新 更多