2013-06-28 48 views
4

我有一個自定義的中間件,每次請求調用兩次,我不明白爲什麼。 這是我的中間件:Django:自定義中間件被調用兩次

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:所描述的行爲在每個視圖

UPDATE複製:

我試圖執行process_view,而不是process_request,它被稱爲一旦如預期......爲什麼?

更新2

process_response就像process_request

UDATE 3叫了兩聲:

OOOOH shiiiit!這是一個favicon.ico(我沒有定義自己)的請求......誰在調用這個文件?

+0

它根據請求類型調用一次。頁面中是否存在ajax請求? – karthikr

+1

當然,這只是一個請求,你可能沒有通過'runserver'或類似的東西來提供靜態文件? –

+0

我正在使用開發服務器沒有重新加載,並沒有ajax請求...我試圖實現process_view而不是process_request,它被調用一次,如預期...我不明白:/ – daveoncode

回答

7

的問題是,如果你定義它作爲Django的URL(如下面的代碼)服務的favicon.ico:

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

你所有的中間件被調用兩次:1次,您所請求的頁面+ 1次爲favicon(這總是由瀏覽器調用)。 解決方法很簡單:不使用Django的網址,以便您vaficon,而不是放像:

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

在你的基地模板的<head>

+0

這不是唯一的錯誤來源。 jsi18n網址也可能是一個問題。 – beruic

1

更好的解決方案是將條件添加到您的middlevare函數中,以過濾所有服務函數。

if view_func.__name__ != 'serve':