2010-05-19 4 views
26

Je lance le serveur de développement Django 1.2 et je reçois ces messages d'erreur Broken Pipe quand j'en charge une page avec Chrome ou Safari. Mon collègue reçoit également l'erreur lorsqu'il charge une page de son serveur de développement. Nous n'avons pas ces erreurs en utilisant Opera ou Firefox.Django + WebKit = Pipe brisée

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 

Quelqu'un peut-il m'aider? Je deviens fou de ça!

+0

Combien de temps faut-il pour la vue a demandé à courir? –

+0

La première fois est rapide, mais après avoir obtenu l'erreur de tuyau cassé le chargement de la page suivante prend ~ 10-15 secondes pour terminer: S – jmagnusson

Répondre

22

Ceci n'est pas un problème de Django. Votre navigateur est susceptible de faire quelque chose d'erroné.

Ceci est une erreur commune qui se produit chaque fois que votre navigateur ferme la connexion alors que le serveur dev est toujours occupé envoi de données.

Vérifiez this Django ticket pour plus d'informations.

+0

J'ai juste eu ce problème en utilisant le serveur de développement django (1.3 pré-alpha) et cette réponse est correcte en ce que Django n'est pas en faute (navigateur était Chrome/Safari). J'ai été capable de résoudre le problème en envoyant mes demandes ajax comme POST plutôt que GET. Pour une raison quelconque, les deux navigateurs n'attendaient pas la réponse si la requête ajax était faite via GET. – awesomo

+0

Correct! La réponse de @loretoparisi donne une idée de ce qui pourrait causer ce comportement. –

2

J'avais un problème possiblement lié. Lors de l'utilisation de Safari et Chrome sous Windows, sur ma machine locale sur mon serveur django, certaines vues ne renvoyaient pas de réponse aléatoire aux requêtes POST ajax.

La solution est la suivante:

Les données que je passais à la vue via POST était une paire clé/val: « action = supprimer ». Maintenant, je n'utilisais pas ces données à mon avis. Une fois que j'ai assigné les données à un var à mon avis, (c'est-à-dire foo = request.POST ['action']), la vue retournerait une réponse aux requêtes ajax à chaque fois.

Absolument fou!

13

J'ai récemment rencontré ce problème avec le serveur de développement django v1.1.1 et Chrome 7.0.517.44. Le "correctif" que j'ai découvert fait toujours un rafraîchissement (maintenez la touche Maj et cliquez sur le bouton de rechargement dans Chrome) sur la page après le chargement initial, ce qui oblige Chrome à ignorer son cache pour toutes les ressources demandées par Google. le rafraîchissement. En tant que tel, cela me porte à croire que c'est un problème avec la tendance notoire de Chrome à mettre en cache tout ce qu'il peut possible; même quand ça ne devrait pas. Ma conjecture est que Chrome est en train de faire une demande de ressources et de supprimer immédiatement la connexion pour cette ressource une fois qu'elle se rend compte qu'elle a mis en cache la ressource.

Cela serait presque une solution de contournement supportable, sauf les demandes AJAX continueront à causer des problèmes.

3

Un tuyau cassé se produit lorsque le navigateur ferme la connexion avec le serveur. Ce problème est arrivé avec moi avant sur la demande de post ajax associée à <a href="... parce que j'ai oublié d'ajouter e.preventDefault() dans la fonction de gestionnaire de clic. Donc, ce qui est arrivé est que le navigateur envoie la demande de poste et ferme la connexion et envoie une autre demande get. Vous verrez donc que la demande de publication a été annulée par le navigateur.

7

Cela peut être dû à une erreur dans la fonction javascript qui envoie l'appel ajax.Par exemple, la fonction peut être déclenchée par un événement click sur un lien, et si l'action par défaut de lien n'est pas empêchée, vous obtiendrez immédiatement une requête secondaire et le navigateur fermera la connexion précédente sans attendre la réponse à finir. J'ai eu le même problème lorsque j'ai oublié d'ajouter return false au gestionnaire d'événements.

Le même symptôme peut se produire si le gestionnaire d'événements qui déclenche ajax lève une exception.

Déboguez soigneusement la fonction effectuant la requête ajax et la valeur de retour de cette fonction. Dans le cas où cela se produirait avec un client JavaScript, une solution pourrait être la suivante:

+1

MERCI! Je viens de passer une heure à comprendre que j'avais besoin de ce "retour Faux" dans ma jquery ajax. Il a seulement été nécessaire pour le POST et en tant que tel m'a jeté hors cette fois ... – InfinteScroll

0

Vous devez ajouter preventDefault et return false au début et à la fin de votre gestionnaire d'événements comme:

$('#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

Mec, ce n'est pas javascript ... – jmagnusson

+0

@jmagnusson droite, j'ai eu le même problème avec un client javascript, c'est pourquoi. Expliqué dans la réponse alors! – loretoparisi

+0

Merci! C'est exactement ce qui causait le problème dans Chrome. Firefox le comprendrait bien. Upvote! –