当我覆盖urls.py中的handler404和handler500时,如此:
from myapp.views import not_found_view
handler404 = not_found_view
handler500 = not_found_view
并在我的中间件中调用raise Http404()
,我看到了我的404页面。
当我从我的中间件handler404
和handler500
中删除urls.py
和raise Http404()
时,我会看到我的默认500错误页面(来自Django Suit) - 因此我之所以要设置自定义404模板,以便在raise Http404()
上使用。
现在我的问题:当我删除handler500并且只设置handler404 时,我也会看到一个HTTP 500页面! :|
为什么在我handler500
??
raise Http404()
我在多个应用中有多个模板目录,我尝试在我的主应用中放置一个包含设置的404.html
,并在另一个“普通”应用中放置但不起作用..
我也将DEBUG
设置为False
。
希望有人能回答我的问题!
答案 0 :(得分:8)
如果您只想替换Django的模板,则不必编写自己的处理程序。 Django使用404.html
和500.html
文件作为模板,您可以使用相同名称的文件替换settings.TEMPLATE_DIRS
中列出的目录。
在您的示例中,这意味着您可以创建myapp/templates/404.html
和myapp/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)