django中的flatpages使用

django中的flatpages是一个简单而有用的app,它负责管理简单的页面,比如一个网站中的关于本站、关于我、联系方面、人才招聘等页面, 这些页面不常修改,以静态页面为主。flatpages提供了后台管理这些静态页面的界面,直接编写html,内容存于数据库中, 设置好各页面的链接,以及渲染的模板,就搞定了。详细内容可参照flatpages使用方法官方说明

页面正常访问,但是后台日志有404错误

[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()函数是整个处理的核心流程,大致按这么个次序:

  1. request middleware,使用注册的middleware的process_request方法
  2. url resolve,遍历匹配所有urls正则,找到应该使用的view
  3. view middleware,使用注册的middleware的process_view方法
  4. view render和exception middleware,渲染页面,有异常就使用注册的middleware的process_exception方法
  5. template response middleware,使用注册的middleware的process_template_response方法,主要用于decorator
  6. response middleware,使用注册的middleware的process_response方法
  7. return response,返回页面

特别注意:template response middleware、response middleware和exception middleware在使用时,是逆序进行的。

与此同时,flatpages在官方说明上,有两种使用方法:

  1. 修改URLconf文件中的urlpatterns
  2. 注册django.contrib.flatpages.middleware.FlatpageFallbackMiddleware中间件

似乎方法二比较简单,只需要注册一下就OK了,但问题就出现在这里。FlatpageFallbackMiddleware中间件实际是一个response middleware, 也就是说,当所有的处理流程都完成了,发现结果是404,然后就由FlatpageFallbackMiddleware中间件尝试处理一下,看能不能挽回一把。 这就导致了页面可以正常访问,但是日志里会有404错误的原因。这种方式还会导致,所有的404都会有一次查数据库行为。

换用方法一,就能解决这个问题了。

404错误消失了,URL自动添加反斜杠功能失效

偶然发现,访问/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后台指定访问链接时, 必须要带上结尾反斜杠。

发表于 2014年10月20日 17:57   评论:0   阅读:2152  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo