【问题标题】:Django handler404 not called on raise Http404()Django handler404 未调用 raise Http404()
【发布时间】:2015-06-25 12:19:31
【问题描述】:

当我像这样覆盖我的 urls.py 中的 handler404 和 handler500 时:

from myapp.views import not_found_view

handler404 = not_found_view
handler500 = not_found_view

并在我的中间件中调用raise Http404(),我会看到我的 404 页面。

当我从我的中间件中的urls.pyraise Http404() 中同时删除handler404handler500 时,我看到了我的默认500 错误页面(来自Django Suit) - 因此我试图设置一个用于raise Http404() 的自定义 404 模板。

现在我的问题是:当我删除 handler500 并只设置 handler404 时,我还会看到一个 HTTP 500 页面! :|

为什么当我raise Http404() 时我的handler500 被调用??

我在多个应用程序中有多个模板目录,我尝试在包含设置的主应用程序和另一个“正常”应用程序中放置一个 404.html,但这不起作用..

我也将DEBUG 设置为False

希望有人能回答我的问题!

【问题讨论】:

    标签: python django django-templates http-status-code-404


    【解决方案1】:

    如果您只想替换 Django 的模板,则不必编写自己的处理程序。 Django 使用404.html500.html 文件作为模板,您可以将它们替换为将同名文件放到settings.TEMPLATE_DIRS 中列出的目录中。

    在您的示例中,这意味着您可以创建 myapp/templates/404.htmlmyapp/templates/500.html 文件。

    请注意,您必须将 DEBUG 设置为 False 才能设置这些模板。

    查看this article了解更多详情。

    【讨论】:

    • 这正是我所做的,我的 TEMPLATE_DIRS 包含:'myapp/templates' 但我不断收到 500 错误页面
    • 您的 404.html 文件似乎有问题,并且由于 Django 崩溃而出现 500 错误。设置日志记录到文件并检查您收到 500 错误的原因。检查此以获取帮助:ianalexandr.com/blog/…
    • 如果你使用的是Django的开发服务器,也可以登录到控制台。
    • 多年来,我了解到应该始终检查日志,所以我在问问题之前就这样做了:) 我的日志也显示:raise Http404 .. 奇怪的是 Django 没有在我的templates 目录中似乎根本找不到我的404.html/500.html..
    • 将此添加到您的 url 以检查 Django 是否找到模板:url(r'^404$', TemplateView.as_view(template_name="404.html")),
    【解决方案2】:

    我遇到了类似的情况。我的自定义处理程序 404 WAS 被调用,但我的浏览器响应显示 error500。

    经检查,我发现模板中有语法错误。因此,500 是由它引起的。我修复了模板,结果如愿。

    第 22 个问题是,默认情况下,模板调试 == 调试,因此如果您设置 DEBUG=False,那么模板调试也将为 false;您将看到没有模板错误跟踪的 500 错误。

    因此,在您的 handler404 视图中放置一个 print() 语句,就在返回 render() 之前。如果您在 django 控制台中看到输出,您就会知道错误在您的模板中。

    您也可以在您的 settings.py (django 1.8+) 中尝试此操作,但这似乎对我不起作用,并且在修复模板后我没有遵循。

    TEMPLATES = [
        {
    
            'OPTIONS': {
                 'debug': True,
             }
        },
    

    【讨论】:

      【解决方案3】:

      另一个解决方案是替换 (monkey-patch) Django 的 page_not_found。

      from django.views import defaults
      from myapp.views import not_found_view
      
      defaults.page_not_found = not_found_view
      

      猴子补丁是不好的做法,如果 Django 更新内部 API,它可能会停止工作,但在某些情况下仍然可能有用。前任。如果其他方法因某种原因不起作用。

      【讨论】:

        【解决方案4】:

        404-page-not-found-view 需要一个“异常”参数:

        def handler404(request, exception):
            return render(request, 'customer/home_page/404.html', status=404)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-09
          • 1970-01-01
          • 2012-08-24
          • 2021-07-05
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多