Django:两次调用自定义中间件

时间:2013-06-28 20:01:07

标签: django django-middleware

我有一个自定义中间件,每次请求都会调用两次,我不明白为什么。 这是我的中间件:

class MyMiddleWare(object):

  def process_request(self, request):
    print 'FOO'
    return None

这是我的中间件设置:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'MyMiddleware',
)

这是主页请求后控制台中的输出:

[28/Jun/2013 19:48:26] FOO
[28/Jun/2013 19:48:26] "GET / HTTP/1.1" 200 7468
[28/Jun/2013 19:48:27] FOO

我试图评论所有其他中间件,问题是一样的。我该怎么办?

ps:所描述的行为可在每个视图中复制

更新

我尝试实施process_view而不是process_request,并按预期调用一次......为什么?

更新2

process_response被调用两次,如process_request

UDATE 3

ooooh shiiiit!这是对favicon.ico的请求(我自己没有定义)......谁在调用这个文件?

2 个答案:

答案 0 :(得分:8)

问题是如果你通过将它定义为django url(如下面的代码)来提供favicon.ico:

(r'^favicon\.ico$',
  'django.views.generic.simple.redirect_to',
  {'url': settings.MEDIA_URL+'images/favicon.ico'}),

您的所有中间件都会被调用两次:您请求的页面有1次,对于favicon有1次(浏览器总是调用)。 解决方案很简单:不要使用django urls来为你的vaficon服务,而是使用类似的东西:

<link rel="icon" type="image/png" href="{% static 'core/img/favicon.ico' %}" />

在基本模板的<head>中!

答案 1 :(得分:1)

更好的解决方案是在middlevare函数中添加条件,过滤所有服务函数。

if view_func.__name__ != 'serve':