2010-05-19 13 views
26

Używam serwera programistycznego Django 1.2 i otrzymuję te komunikaty o błędach, gdy tylko załaduję stronę z przeglądarki Chrome lub Safari. Mój współpracownik również otrzymuje błąd, gdy ładuje stronę ze swojego serwera. Nie mamy tych błędów podczas korzystania z Opery lub Firefoksa.Django + WebKit = Uszkodzona rura

Traceback (most recent call last): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 281, in run self.finish_response() 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 321, in finish_response self.write(data) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 417, in write self._write(data) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 300, in write self.flush() 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 286, in flush self._sock.sendall(buffer) 
error: [Errno 32] Broken pipe 

Czy ktoś może mi pomóc? Szaleję nad tym!

+0

Jak długo trwa wnioskowanej celu uruchomienia? –

+0

Pierwszy raz jest szybki, ale po tym, jak dostałem przerwany błąd rury, kolejne ładowanie strony trwa ~ 10-15 sekund, aby zakończyć: S – jmagnusson

Odpowiedz

22

To nie jest problem Django. Twoja przeglądarka najprawdopodobniej robi coś błędnego.

Jest to częsty błąd, który dzieje gdy przeglądarka zamyka połączenie gdy serwer dev jest wciąż zajęty wysyłanie danych.

Aby uzyskać więcej informacji, sprawdź numer this Django ticket.

+0

Po prostu miałem ten problem podczas korzystania z serwera deweloperskiego django (1.3 pre-alpha) i ta odpowiedź jest poprawna, ponieważ django nie ponosi winy (przeglądarka była Chrome/Safari). Byłem w stanie rozwiązać problem wysyłając moje żądania ajax jako POST zamiast GET. Z jakiegoś powodu obie przeglądarki nie czekały na odpowiedź, jeśli żądanie ajax zostało wykonane przez GET. – awesomo

+0

Prawidłowo! Odpowiedź @loretoparisi daje pojęcie, co może spowodować takie zachowanie. –

2

Miałem prawdopodobnie powiązany problem.

Podczas korzystania z Safari i Chrome w systemie Windows, na moim komputerze lokalnym na moim serwerze uruchomień django, niektóre widoki losowo nie zwracały odpowiedzi na żądania ajax POST.

Rozwiązaniem było to:

Dane byłem przechodząc do widoku poprzez post był tylko jeden klucz/val pary: „action = usuń”. Teraz faktycznie nie korzystałem z tych danych w moim widoku. Po przypisaniu danych do zmiennej w moim widoku (tj. Foo = request.POST ['action']), widok będzie zwracał odpowiedź na żądania ajax za każdym razem.

Absolutnie zwariowany!

13

Niedawno wpadłem na ten problem z serwerem dev django v1.1.1 i Chrome 7.0.517.44.

"Odkryta przeze mnie" poprawka zawsze powoduje odświeżenie (przytrzymaj Shift i kliknij przycisk ponownego ładowania w przeglądarce Chrome) na stronie po początkowym wczytaniu, co powoduje, że Chrome ignoruje jego pamięć podręczną dla wszelkich zasobów wymaganych przez odświeżenie.

W związku z tym, wydaje mi się, że jest to problem związany z notoryczną tendencją Chrome do przechowywania w pamięci podręcznej wszystkiego, co tylko możliwe; nawet gdy nie powinno. Domyślam się, że Chrome wysyła żądanie zasobu, a następnie natychmiast zrzuca połączenie dla wspomnianego zasobu, gdy tylko zorientuje się, że ma bufor pamięci.

To byłoby prawie możliwe do zniesienia obejście, z wyjątkiem sytuacji, w których żądania AJAX nadal będą powodować problemy.

3

Zerwana rura występuje, gdy przeglądarka zamyka połączenie z serwerem. Ten problem zdarzył się u mnie wcześniej na żądanie ajax ajax związane z <a href="..., ponieważ zapomniałem dodać e.preventDefault() w funkcji obsługi kliknięcia. Tak więc, co się stało, przeglądarka wysyła żądanie postu, zamyka połączenie i wysyła kolejną prośbę o pobranie. Dzięki temu zobaczysz, że żądanie postu zostało anulowane przez przeglądarkę.

7

Może to być spowodowane błędem w funkcji javascript wywołującej wywołanie ajax.

Na przykład, funkcja może zostać wywołana przez kliknięcie zdarzenia na łączu, a jeśli domyślna akcja łącza nie zostanie zablokowana, natychmiast otrzymasz wtórne żądanie, a przeglądarka zamknie poprzednie połączenie bez czekania na odpowiedź na zakończenie. Miałem ten sam problem, gdy zapomniałem dodać do obsługi zdarzenia return false.

Ten sam objaw może wystąpić, jeśli procedura obsługi zdarzenia wyzwalająca program ajax zgłasza wyjątek.

Dokładnie debuguj funkcję składającą zapytanie do ajax i zwracaną wartość tej funkcji.

+1

DZIĘKUJEMY! Po prostu spędziłem godzinę zastanawiając się, że potrzebuję tego "zwracać Fałsz" w moim ajax jquery. To było tylko potrzebne dla POST i jako takie wyrzuciło mnie tym razem ... – InfinteScroll

0

W przypadku, gdy dzieje się to z klientem JavaScript, rozwiązaniem może być następujące rozwiązanie. Trzeba dodać preventDefault i return false na początku i na końcu programu obsługi zdarzeń takich jak:

$('#btn_analyze').click(function(e) { 
    e.preventDefault() 
    $.post('/api/v1/analyzer/', 
     data, 
     "json").done(function(response) { 
     //... 
    }).fail(function() { 
     Logger.error(" Error ") 
    }) 

    return false 
}) // analyze click 
+0

Dude, to nie jest javascript ... – jmagnusson

+0

@jmagnusson prawda, miałem ten sam problem z klientem javascript, dlatego. Wyjaśniono więc w odpowiedzi! – loretoparisi

+0

Dziękujemy! Właśnie to powoduje problem w Chrome. Firefox po prostu dobrze to zrozumie. Awansuj! –

Powiązane problemy