我有一个自定义中间件,每次请求都会调用两次,我不明白为什么。 这是我的中间件:
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的请求(我自己没有定义)......谁在调用这个文件?
答案 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':