Gunicorn: 'Response'-Objekt hat kein Attribut 'status_code' in wsgi.py mit Websockets

Erstellt am 16. Feb. 2016  ·  36Kommentare  ·  Quelle: benoitc/gunicorn

Ich starte meine App mit

gunicorn --worker-class eventlet -w 1 server:app --bind="127.0.0.1:5000"

Und wenn ich Flack-SocketIO für Websockets verwende, erhalte ich oft einen Fehler, bei dem Gunicorn nicht richtig von einer Funktion zurückkehrt

[2016-01-30 10:20:53 -0800] [7330] [ERROR] Error handling request
Traceback (most recent call last):
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/workers/async.py", line 52, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/workers/async.py", line 114, in handle_request
    resp.close()
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 423, in close
    self.send_headers()
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 316, in send_headers
    tosend = self.default_headers()
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 297, in default_headers
    elif self.should_close():
  File "/Users/brianclark/Desktop/Projects/HDP/application/api/venv/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 230, in should_close
    if self.status_code < 200 or self.status_code in (204, 304):
AttributeError: 'Response' object has no attribute 'status_code'

Irgendwelche Ratschläge zu Konfigurationen, die ich verwenden könnte, um dies zu beheben, oder ist es ein Fehler?

Feedback Requested Discussion Investigation help wanted

Hilfreichster Kommentar

@kramer65 ich

Alle 36 Kommentare

@bclark8923 Haben Sie eine Anwendung, die helfen könnte, das Problem zu reproduzieren?

Jep! Was soll ich tun?

Am Montag, 28. März 2016, schrieb Benoit Chesneau [email protected] :

@bclark8923 https://github.com/bclark8923 haben Sie eine Anwendung ?
das könnte helfen, das Problem zu reproduzieren?


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-202484667

Vielen Dank,
Brian Clark
(248) 990 5616
www.hdphealth.com

Lerne mich auf Facebook https://facebook.com/bclark8923 & Twitter kennen
https://twitter.com/blaurenceclark!

@ bclark8923 wenn es gestreamt werden kann, damit ich irgendwann einen Teil in einen Test

Und welche Gunicorn-Version verwendest du?

Ja bitte! Senden Sie mir [email protected] und 19.x kann irgendwie überprüfen
demnächst

Am Montag, 28. März 2016, schrieb Benoit Chesneau [email protected] :

@bclark8923 https://github.com/bclark8923 wenn es so gestreamt werden kann
Irgendwann könnte ich einen Teil in einen Test einbeziehen, der helfen würde :)

Und welche Gunicorn-Version verwendest du?


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-202492005

Vielen Dank,
Brian Clark
(248) 990 5616
www.hdphealth.com

Lerne mich auf Facebook https://facebook.com/bclark8923 & Twitter kennen
https://twitter.com/blaurenceclark!

Verwenden von Version 19.4.5

Ich habe das gleiche Problem. Ich verwende Gunicorn-Version 18.0.

Irgendein Fix schon verfügbar?

Wenn jemand Z-Code hat, um es zu reproduzieren, würde das helfen :)

@benoitc - Das macht Sinn.. ;-)

Ich werde nächste Woche etwas in Ordnung bringen und euch Bescheid geben!

@benoitc - Okay, ich habe doch noch vor dem Wochenende etwas

Das Repo mit Anleitung findet ihr in der Readme hier: https://github.com/kramer65/gunicorn-error

btw: Ich benutze Gunicorn Version 18.0

Wahrscheinlich muss etwas gunicorn.workers.async.ALREADY_HANDLED oder gunicorn wird versuchen, die Anfrage zu protokollieren, sobald die Anwendung von ihrem WSGI-Handler zurückkehrt. Gunicorn muss stattdessen wissen, dass die Anfrage jetzt vollständig von der Anwendung bearbeitet wird.

Beide Beispiele im Verzeichnis "examples/websocket" geben diese Konstante von ihrem WSGI-Handler zurück.

@benoitc - Hilft

@kramer65 ja, ich habe den Fehler reproduziert.

Gunicorn ist also eine reine WSGI-Engine und erwartet eine WSGI-Antwort mit einem Status:
https://github.com/benoitc/gunicorn/blob/master/gunicorn/http/wsgi.py#L242

(bezogen auf diesen Code: https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/async.py#L103-L119)

Wie @tilgovi sagte, können Sie die Antwortbehandlung von gunicorn umgehen, indem Sie ALREADY_HANDLED zurückgeben

Soweit ich den Code von Flash-Socketio gelesen habe, verpackt er die Kolbenanwendung in socketio.Middleware die selbst inheit von engineio.middleware.Middleware :
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py

die die wsgi-Anwendung oder ihren eigenen Handler zurückgeben, wenn sie den Pfad findet:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py#L45 -L52

Es gibt also socketio.Server.handle_request im Websocket-Pfad zurück:
https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/flask_socketio/__init__.py#L144

die selbst engineio.Server.handle_request (viele zirkuläre Deps in diesem Projekt ...):
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L184

An dieser Stelle scheint es, dass weder socket.handle_get_request noch socket. handle_post_request den Status festlegen:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/socket.py#L69 -L96

Und dann kann hier ein Fehler passieren:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

da es eine Antwort zurückgeben kann, ohne einen Status oder irgendetwas gesetzt zu haben. Ich kann sehen, dass das Upgrade dasselbe Websocket-Objekt wie in unserem Beispiel verwendet:
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py

Ich denke, anstatt die letzten r hier zurückzugeben:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

Es sollte wahrscheinlich ALREADY_HANDLED wie dort zurückgeben:
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py#L115

Nur eine Vermutung, da dieser Code ziemlich schwer zu lesen ist. Hoffentlich wird es helfen.

@kramer65 lass mich trotzdem über den Status dieses Tickets für dich wissen :)

@benoitc die ALREADY_HANDLED ist spezifisch für Gunicorn. Eventlet hat eine eigene Version dieser Konstante, die anders definiert ist: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/wsgi.py#L69.

Der r , dem Sie durch den Code gefolgt sind, gibt den Wert ALREADY_HANDLED des Evenlets zurück, wenn die Websocket-Verbindung endet. Dies wird automatisch vom Eventlet verarbeitet: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/websocket.py#L135.

Gunicorn sollte (glaube ich) die ALREADY_HANDLED Konstante von Eventlet zusätzlich zu seiner eigenen erkennen und auf die gleiche Weise behandeln. Ich denke, das wird dieses Problem lösen.

Es ist großartig, wenn Sie dieses Problem beheben können. Ich verwende flask-socketio & gunicorn in meiner Produktion und möchte keine Daten verlieren.

Ich habe ähnliche Probleme und wollte wissen, ob es Neuigkeiten zu diesem Thema gibt?

@benoitc - Glaubst du, dass der Vorschlag von @miguelgrinberg oben (Gunicorn die ALREADY_HANDLED-Konstante von Eventlet zusätzlich zu seiner eigenen erkennen und auf die gleiche Weise behandeln zu lassen) eine gute Idee ist?

@kramer65 Wenn Sie eine Möglichkeit finden, die Unterstützung dafür sauber hinzuzufügen, ist es meiner Meinung nach sinnvoll, dass der Eventlet-Worker damit umgeht.

Im Moment ist die Logik, um dies zu handhaben, etwas in gunicorn.workers.async.AsyncWorker#handle_request vergraben, aber vielleicht könnte dies indirekt über eine statische Eigenschaft gehandhabt werden, die der Eventlet-Worker überschreiben kann, oder indem eine Instanzmethode aufgerufen wird, um zu überprüfen, dass bereits ein Worker verarbeitet wurde- spezifische Logik, die möglicherweise vorhanden ist, wobei die Basisklasse das tut, was sie jetzt tut.

@tilgovi - Es ist schon eine Weile her, dass du mir deine Nachricht geschickt hast, aber ich wollte doch darauf antworten. Das Problem ist, dass ich irgendwie an meine Grenzen stoße, was ich dafür tun kann. Ich habe wirklich keine Ahnung, wie ich vorgehen soll, um das zu lösen.

In der Zwischenzeit sind meine Protokolle mit Fehlermeldungen wie der folgenden gefüllt, daher habe ich allen Grund, etwas Energie in die Lösung dieses Problems zu investieren. Ich verstehe nur nicht ganz, was die genaue Ursache des Problems ist, geschweige denn, dass ich verstehe, wie ich das lösen könnte.

Wenn jemand Kontakt aufnehmen möchte, bespreche ich das Thema gerne, dann kann ich vielleicht ein bisschen mehr helfen als ich es jetzt bin.

2016-08-23 08:07:16 [2185] [ERROR] Error handling request
Traceback (most recent call last):
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/workers/async.py", line 45, in handle
    self.handle_request(listener, req, client, addr)
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/workers/async.py", line 102, in handle_request
    resp.close()
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 369, in close
    self.send_headers()
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 284, in send_headers
    tosend = self.default_headers()
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 265, in default_headers
    elif self.should_close():
  File "/var/www/imd/venv/local/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 198, in should_close
    if self.status_code < 200 or self.status_code in (204, 304):
AttributeError: 'Response' object has no attribute 'status_code'

hat man es repariert ?.....

@qwexvf - Leider nicht. Meine Logs füllen sich immer noch mit Fehlern. :-(

Irgendwer anders?

@kramer65 ich

irgendwelche Updates?

Ich bin sicher, es gibt sauberere Möglichkeiten, dies zu beheben, aber es ist zumindest ein Anfang.

@stefaang danke, ich werde es versuchen, dachte es!

Wann wird der Fix dafür auf PyPI veröffentlicht?

Morgen
Am Freitag, den 17. Februar 2017 um 16:46 Uhr schrieb Eddie [email protected] :

Wann wird der Fix dafür auf PyPI veröffentlicht?


Sie erhalten dies, weil Sie den Status Öffnen/Schließen geändert haben.

Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-280685264 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAA4ogTRMF7EfR25G6gLrktOdh_iA4Ciks5rdcDYgaJpZM4HbcdP
.

Wurde es freigegeben?

@benoitc ein Wort zum Update, das auf pypi verschoben wird?

@defionscode Ich werde am Donnerstagmorgen (morgen) eine Veröffentlichung vornehmen.

Großartig, vielen Dank
Am Mittwoch, 22. Februar 2017 um 11:54 Uhr Benoit Chesneau [email protected]
schrieb:

@defionscode https://github.com/defionscode ich werde in on eine Veröffentlichung machen
donnerstagmorgen (morgen).


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-281729992 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AEcrYp6QfVpWXhG14f4M-lPDHMn0cFncks5rfGhWgaJpZM4HbcdP
.

Wurde dieser Fix veröffentlicht?

Der Status von https://github.com/benoitc/gunicorn/issues/1471 verfolgt . Heute wird es veröffentlicht...

Dieser Fehler tritt auf meiner Seite immer noch mit der neuesten Version 19 und 20 von gunicorn auf. Sollte es werden ?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

zenglingyu picture zenglingyu  ·  4Kommentare

ttcqaq picture ttcqaq  ·  4Kommentare

twosigmajab picture twosigmajab  ·  4Kommentare

thomasjungblut picture thomasjungblut  ·  3Kommentare

benoitc picture benoitc  ·  4Kommentare