2013-07-28 4 views
4

Извините за мой плохой английский, я постараюсь описать свою проблему как можно лучше. Я использую Django 1.5 с Python 3.2. Я использую django.contrib.messages для отображения сообщений пользователям после их перенаправления. Если я попытаюсь загрузить страницу, перенаправляющую на другую страницу с сообщением, после нескольких попыток она не удаляет предыдущие сообщения (только на последней предыдущей странице). Итак, я вижу два одинаковых сообщения. Это происходит только в Google Chrome (и Cromium). Никогда в FireFox или Opera. Независимо от того, сохраняются ли сообщения в виде файлов cookie или в сеансе. Функция просмотра вызывается дважды, но я не знаю, почему и что конкретно связано с этим Chrome (???).django view called дважды

Я записал видео: http://www.youtube.com/watch?v=nXtQ0uj1Hbw&feature=youtu.be.

Добавлено позже ...

Ok. Я начал новый проект именно для этого (проекта «MySite», содержащего одно приложения внутри него называется «test_app»):

содержимых MySITE/urls.py:

from django.conf.urls import patterns, include, url 

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

содержимого test_app.py

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'), 
) 

содержание test_app/views.py

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', {}) 

содержание TestApp/шаблоны/панциря с/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 - Apache 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

Почтовый код URL-адресов, просмотров и откуда вы перенаправляете. –

+0

Пожалуйста, разместите свой код, и ваш английский замечательный. –

ответ

0

Privet! Попробуйте запустить приложение на нестрочном веб-сервере django. Я не знаю, но, может быть, и часто обновляю страницу, и biult в веб-сервере не успевает завершить предыдущий ответ.

+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 установлен в «реальный кеш», например MemcachedCache или LocMemCache (значение по умолчанию, если эта переменная не установлена) и т. Д.

3

Google Chrome отправляет запрос при вводе URL-адреса. Итак, когда вы нажмете enter, он отправит другой запрос. Проблема, с которой вы сталкиваетесь, вероятно, связана с тем, что время между вводом URL и нажатием кнопки очень короткое.

Возможно, вы можете реализовать временное представление like, чтобы обойти проблему.

1

Именно эта линия, которая называет свои взгляды дважды:

возвращение визуализации (запрос, 'TestApp/template.html', {})

Я столкнулся с той же проблемой .. .I распечатаны все запрос и проверил журналы manage.py и обнаружили, что render calls views two more times for css files

Чтобы избежать этого, я вызывал другую функцию для обработки данных. Конечно, вы можете добавить

если request.method == 'POST':

, чтобы решить эту проблему.