我通常会将一个全能的404正则表达式添加到我的Django网站,作为我的urls.py中的最后一个表达式:
urlpatterns += patterns('django.views.generic.simple',
(r'^.', 'direct_to_template', {'template': 'unknown.html'}),
我对这方面的表现感到满意。 unknown.html模板扩展了我的基本模板,很好地告诉观众他们输入的网址不存在,但页面仍然具有我网站的所有导航和样式。
但是,在不得不反复告诉人们输入尾部斜杠之后,我觉得需要设置settings.py中的APPEND_SLASH = True参数。
文档状态:
如果APPEND_SLASH为True,则为 初始URL不以斜杠结尾, 并且在URLconf中找不到, 然后通过追加形成一个新的URL 最后的斜线。如果这个新URL是 在URLconf中找到,然后是Django 将请求重定向到此新URL。 否则,初始URL是 像往常一样处理。
因此遵循这个逻辑,foo.com/bar成功捕获了我的“404”url表达式,然后才能重定向到我的foo.com/bar/ url表达式。 *
维护友好/自定义catchall 404页面的最佳方式是什么,同时还能够使用APPEND_SLASH或类似功能的东西?*
- 编辑/答案 - 的
不知怎的,我错过了你只需要添加一个名为404.html的模板,并确保DEBUG = False
感谢DTing!
答案 0 :(得分:3)
我认为您只需自定义404.html而不是使用“catchall”,因为您只是重定向到自定义模板。您的自定义404.html模板无法扩展您网站的base.html。
http://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views
有关404观点的三点注意事项:
- 如果Django之后没有找到匹配项,也会调用404视图 检查每个正则表达式 URLconf。
- 如果您没有定义自己的404视图 - 只需使用默认值, 这是推荐 - 你还有 一个义务:你必须创造一个 404.html模板位于模板目录的根目录中。默认404 视图将使用该模板 404错误。默认的404视图将 将一个变量传递给模板: request_path,即URL 结果是404。
- 404视图传递一个RequestContext并且可以访问 您提供的变量 TEMPLATE_CONTEXT_PROCESSORS设置 (例如,MEDIA_URL)。
- 如果DEBUG设置为True(在您的设置模块中),那么您的404视图 将永远不会被使用,以及追溯 将会显示。
如果您确实想使用自定义视图,
此page_not_found视图应该 足以满足99%的Web应用程序, 但是如果你想覆盖404 在view中,你可以在中指定handler404 您的URLconf,如下所示:
handler404 = 'mysite.views.my_custom_404_view'