Django handler404没有调用提升Http404()

时间:2015-04-18 16:08:36

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

当我覆盖urls.py中的handler404和handler500时,如此:

from myapp.views import not_found_view

handler404 = not_found_view
handler500 = not_found_view

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

当我从我的中间件handler404handler500中删除urls.pyraise Http404()时,我会看到我的默认500错误页面(来自Django Suit) - 因此我之所以要设置自定义404模板,以便在raise Http404()上使用。

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

为什么在我handler500 ??

时调用raise Http404()

我在多个应用中有多个模板目录,我尝试在我的主应用中放置一个包含设置的404.html,并在另一个“普通”应用中放置但不起作用..

我也将DEBUG设置为False

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

4 个答案:

答案 0 :(得分:8)

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

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

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

检查this article是否有详细信息。

答案 1 :(得分:0)

另一个解决方案是替换(猴子补丁)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可能会停止工作,但在某些情况下仍然有用。防爆。如果其他方法因某种原因不起作用。

答案 2 :(得分:0)

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

经检查,我发现模板中存在语法错误。因此,这就是500造成的。我修复了模板,结果达到了预期。

问题22是默认情况下,模板debug == debug,因此,如果将DEBUG = False设置为false,则模板debug也将为false。您会看到没有模板错误跟踪的500错误。

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

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

TEMPLATES = [
    {

        'OPTIONS': {
             'debug': True,
         }
    },

答案 3 :(得分:0)

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

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