Django-尝试使用APPEND_SLASH和自定义catchall 404视图

时间:2011-04-25 14:23:38

标签: django http-status-code-404 django-urls

我通常会将一个全能的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!

1 个答案:

答案 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'