2013-07-28 68 views
4

對不起我的英文不好,我會盡我所能描述我的問題。 我在Python 3.2中使用Django 1.5。我使用django.contrib.messages在重定向它們之後向用戶顯示消息。如果我嘗試加載重定向到顯示消息的另一個頁面的頁面,則在嘗試多次後,它不會刪除以前的消息(僅限最後一頁)。所以,我看到的是2個相同的消息。這隻發生在Google Chrome(和Cromium)中。從來沒有在FireFox或Opera。無論消息是保存爲cookie還是保存在會話中。 視圖函數被調用兩次,但我不知道爲什麼和Chrome特別與它做了什麼(???)。我已錄製視頻:http://www.youtube.com/watch?v=nXtQ0uj1Hbw&feature=youtu.bedjango視圖被調用兩次

稍後添加...

好的。我已經開始了一個新的項目只是爲了這個(項目 「mysite的」 包含一個應用裏面稱爲 「test_app」):mysite的/ urls.py的

內容:

test_app.py的
from django.conf.urls import patterns, include, url 

urlpatterns = patterns('', 
    url(r'^ms', include('test_app.urls', namespace="testapp")), 
) 

內容test_app的

from django.conf.urls import patterns, url 


urlpatterns = patterns('test_app.views', 
    url(r'/go-away/$', 'go_away', name='go-away'), 
    url(r'/come-here/$', 'come_here', name='come-here'), 
) 

內容/ views.py

testapp /模板/種皮的
from django.shortcuts import render 
from django.core.urlresolvers import reverse 
from django.http import HttpResponseRedirect 
from django.contrib import messages 

import random 

def go_away(request): 

    messages.info(request, 'FORBIDDEN PLACE! Float: %f' % random.random()) 
    return HttpResponseRedirect(reverse('testapp:come-here')) 

def come_here(request): 
    return render(request, 'testapp/template.html', {}) 

內容PP/template.html

{% if messages %} 
    <ul> 
     {% for message in messages %} 
      <li>{{ message }}</li> 
     {% endfor %} 
    </ul> 
{% else %} 
    There was no redirection. 
{% endif %} 
從所有這些

開,我添加到我的settings.py(在和):

# Context processors 
TEMPLATE_CONTEXT_PROCESSORS = { 
    'django.contrib.messages.context_processors.messages', 
} 

配置數據庫(mysite的/ mysite.db),甚至跑命令「python3 manage.py syncdb」

沒有其他的事情。您可以輕鬆再現。

我的軟件: - Python的3.2 - Django的1.5 - 阿帕奇2.2 mod_wsgi的從源代碼編譯。 - 所有這一切都在Linux Mint的14

你應該看看到底是什麼: http://www.youtube.com/watch?v=3L27iwP1PqM&feature=youtu.be 質量是不是gratest,但我在這裏粘貼代碼。

正如您所看到的,浮點數全部不同,這意味着消息只在一個請求期間添加,並且不會在任何其他頁面上顯示。這就意味着,我可以理解,視圖函數運行了兩次,忽略了第一次重定向。

P.S .:如果您將消息手動保存到request.session.messages列表中,則與會話相同。 只有當我使用Chrome或Chromium時,纔有這樣的問題。正如你所看到的,歌劇是完美的。

+1

沒有代碼我們怎麼能告訴你哪裏是問題? – Rohan

+0

郵政編碼的網址,意見和你從哪裏重定向。 –

+0

請發佈你的代碼,你的英語很棒。 –

回答

0

女貞! 嘗試運行未在django webserver中構建的應用程序。我不知道,但也許,你經常刷新頁面,並且在web服務器中沒有時間完成以前的響應。

+0

我在apache 2.2,MOD_WSGI 3.4,Python 3.2,Linux Mint 14 64位下運行我的應用程序。 – user2626972

0

我有同樣的問題,除了我使用Django 1.6,Python 2.7,我也在非Chrome瀏覽器(Firefox)中看到此問題。

我發現CACHESsettings這個問題和之間的連接:

嘗試設置您的生產服務器(Apache)的對:

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.dummy.DummyCache', 
    } 
} 

並確保你已經配置SESSION_ENGINE

SESSION_ENGINE = 'django.contrib.sessions.backends.db' 

在我的情況下,只有當CACHES設置爲像「真正的緩存」MemcachedCacheLocMemCache(如果未設置此變量,則爲默認值)等。

3

谷歌瀏覽器在您輸入網址時發送請求。所以,當你輸入時,它會發送另一個請求。您遇到的問題可能是因爲輸入網址和按Enter鍵之間的時間很短。

你也許可以實現一個基於時間的視圖like這是爲了規避問題。

1

這是該行調用你的看法兩次:

返回渲染(請求, 'testapp/template.html',{})

我遇到了同樣的問題.. .I打印請求所有並檢查manage.py的日誌,發現 render calls views two more times for css files

爲了避免這種情況,我調用了另一個函數來處理數據。 當然,你可以添加

如果request.method == 'POST':

來解決這個問題。