django中的flatpages是一个简单而有用的app,它负责管理简单的页面,比如一个网站中的关于本站、关于我、联系方面、人才招聘等页面, 这些页面不常修改,以静态页面为主。flatpages提供了后台管理这些静态页面的界面,直接编写html,内容存于数据库中, 设置好各页面的链接,以及渲染的模板,就搞定了。详细内容可参照flatpages使用方法官方说明。
[2014-10-20 13:59:38,797][WARNING][django.request][base.py:get_response:146] Not Found: /about/me/
在django中,core/handlers/base.py中的get_response()函数是整个处理的核心流程,大致按这么个次序:
特别注意:template response middleware、response middleware和exception middleware在使用时,是逆序进行的。
与此同时,flatpages在官方说明上,有两种使用方法:
似乎方法二比较简单,只需要注册一下就OK了,但问题就出现在这里。FlatpageFallbackMiddleware中间件实际是一个response middleware, 也就是说,当所有的处理流程都完成了,发现结果是404,然后就由FlatpageFallbackMiddleware中间件尝试处理一下,看能不能挽回一把。 这就导致了页面可以正常访问,但是日志里会有404错误的原因。这种方式还会导致,所有的404都会有一次查数据库行为。
换用方法一,就能解决这个问题了。
偶然发现,访问/admin/可以,但是访问/admin不行了:
[2014-10-20 16:36:02,435][WARNING][django.request][base.py:get_response:146] Not Found: /admin
是否自动在url末尾添加反斜框是由配置APPEND_SLASH控制的,同时还有一个配置叫PREPEND_WWW,是控制是否自动在url前加www。 这些功能是在middleware/common.py中实现,这个common middleware是django中最基本最实用的middleware,当然也需要注册才能生效。
common middleware提供了process_request方法,也就是在整个处理流程的最开始,当发现url不是以反斜杠结尾, 又发现该url在所有urlpatterns中匹配不成功,且加上反斜杠之后就能够匹配成功,就会直接返回HttpResponsePermanentRedirect导向新的url。
我的flatpages配置为:
urlpatterns += patterns('',
(r'^', include('django.contrib.flatpages.urls')),
)
问题就出在这,flatpages.urls匹配所有的url,而不论是否以反斜杠结尾,这样,common middleware中添加反斜杠的逻辑就不会走到了。
django官方文档建议如果匹配所有url时,使用如下写法:
urlpatterns += patterns('django.contrib.flatpages.views',
(r'^(?P<url>.*/)$', 'flatpage'),
)
这里匹配的正则为.*/
,即确保必须以反斜杠结尾,且直接指定了views.flatpage,也更高效了。这也明确表示,flatpage后台指定访问链接时, 必须要带上结尾反斜杠。