2013-10-22 10 views
31

Bardzo rzadko, wiadomość Django jest renderowana w odpowiedzi na . Następnie użytkownik jest ponownie wyświetlana, a wiadomość Django jest ponownie wyświetlana. Czasami użytkownik będzie następnie odsłaniać kolejną stronę i ponownie wyświetli tę samą wiadomość.Od czasu do czasu wiadomości Django są powtarzane dla żądań (tj. Nie są usuwane).

To zdarza się bardzo rzadko, ale kiedy to robi, większość użytkowników widzi to samo zachowanie przez kilka chwil. (Zdarzyło się to raz w teście z grupową przeglądarką, a wszyscy w pokoju widzieli to samo zachowanie na każdym z komputerów przez około pięć minut przed odejściem).

To zachowanie wystąpiło w wielu różnych widokach; a poza tym każdy widok dodaje je w ten sam sposób (patrz poniżej).

Nie udało mi się wiarygodnie odtworzyć błędu w naszym wdrożonym środowisku (działającym pod wsgi.py) lub podczas uruchamiania projektu w środowisku lokalnym (działającym pod kontrolą manage.py). (Zaznaczę, że nigdy nie widziałem tego problemu lokalnie.)

Czy ktoś ma pojęcie, dlaczego tak się dzieje?

Przykład dodawania wiadomości powitalnej.

 messages.success(
      request, 
      "Changes to {form} {request} were successfully saved."\ 
      .format(form=self.form.display_name, 
        request=serv_request_id_as_url(self.serv_request)) 
     ) 

Jest to kod szablonu który renderuje wiadomość:

<div id="messages"> 
    {% for message in messages %} 
    <div class="alert alert-{{ message.tags }}"> 
     <a class="close" data-dismiss="alert" href="#" title="Close"><span class="accessibility">Close this message.</span>&times;</a> 
     <strong>{{ message.message|safe }}</strong> 
    </div> 
    {% endfor %} 
</div> 

Istotne ustawienia:

MIDDLEWARE_CLASSES = (
    'django.middleware.gzip.GZipMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'outage.middleware.OutageMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.transaction.TransactionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'utdirect.middleware.HttpHeaderMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', ...) 

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' 

DATABASES = {'default': {'ENGINE': 'django.db.backends.oracle', 
         ...}} 
+0

można określić, jaka jest wiadomość? – Joe

+3

To tylko przypuszczenie, ale jeśli dzieje się to tylko w środowisku wdrożonym, może to mieć coś wspólnego z buforowaniem lub podobnym ... Gdy wystąpi problem, serwer mógł utworzyć nowe procesy, które mają wpływ na pamięć podręczną, wystarczy pomyśleć ... –

+2

Proszę upewnij się, że odczyt sesji nie jest buforowany i że zapis sesji rzeczywiście się powiódł. Django po cichu zignoruje sesje zawierające na przykład nieprzyswajalne obiekty, które mogą spowodować, że wiadomości nie będą poprawnie usuwane. – patrys

Odpowiedz

2

Wydaje się to znakomity problem spowodowany przez buforowanie w Django . Oto komentarz wykonane przez jednego rdzenia Django Developer:

„Nie sądzę, Django może obsługiwać ten problem automatycznie i poprawnie Jest to bardzo powszechny wzorzec do pętli na wiadomości w szablonie bazowym na stronie internetowej.. Jeśli wyłączymy buforowanie, ponieważ wiadomości mogą być wyświetlane na danej stronie, po prostu zabijamy pamięć podręczną większości witryn internetowych. "

Pełne bilet jest tutaj: https://code.djangoproject.com/ticket/13894

Powiązane problemy