6

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

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

日期 3

哦,该死!这是对 favicon.ico 的请求(我自己还没有定义)......谁在调用这个文件?

4

2 回答 2

9

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

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

您的所有中间件都会被调用两次:1 次用于您请求的页面 + 1 次用于网站图标(始终由浏览器调用)。解决方案很简单:不要使用 django url 来为您的 vaficon 提供服务,而是使用如下内容:

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

<head>您的基本模板中!

于 2014-03-07T14:38:09.273 回答
1

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

if view_func.__name__ != 'serve':
于 2016-03-23T22:39:18.960 回答