Gunicorn: El objeto 'Response' no tiene atributo 'status_code' en wsgi.py con websockets

Creado en 16 feb. 2016  ·  36Comentarios  ·  Fuente: benoitc/gunicorn

Inicio mi aplicación usando

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

Y cuando uso Flack-SocketIO para websockets, a menudo obtengo un error con Gunicorn que no regresa de una función correctamente

[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'

¿Algún consejo sobre configuraciones que pueda utilizar para solucionar esto o es un error?

Feedback Requested Discussion Investigation help wanted

Comentario más útil

@ kramer65 ya veo. He estado esperando esto durante mucho tiempo, si alguien tiene la solución, ¡compártala con nosotros! ¡Gracias!

Todos 36 comentarios

@ bclark8923 ¿tiene alguna aplicación que pueda ayudar a reproducir el problema?

¡Sí! ¿Que te gustaría que hiciera?

El lunes 28 de marzo de 2016, Benoit Chesneau [email protected] escribió:

@ bclark8923 https://github.com/bclark8923 ¿tienes alguna aplicación?
que podría ayudar a reproducir el problema?

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment -202484667

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

Conózcame en Facebook https://facebook.com/bclark8923 y Twitter
https://twitter.com/blaurenceclark!

@ bclark8923 si se puede transmitir, por lo que eventualmente podría incluir alguna parte en una prueba que ayudaría :)

Además, ¿qué versión de gunicorn estás usando?

¡Sí, por favor! Envíeme un correo electrónico a [email protected] y 19.x de algún tipo puede verificar
pronto

El lunes 28 de marzo de 2016, Benoit Chesneau [email protected] escribió:

@ bclark8923 https://github.com/bclark8923 si se puede transmitir así
eventualmente podría incluir alguna parte en una prueba que ayudaría :)

Además, ¿qué versión de gunicorn estás usando?

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment -202492005

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

Conózcame en Facebook https://facebook.com/bclark8923 y Twitter
https://twitter.com/blaurenceclark!

Usando la versión 19.4.5

Tengo el mismo problema. Estoy usando gunicorn versión 18.0.

¿Alguna solución ya está disponible?

si alguien tiene código z para reproducirlo, eso ayudaría :)

@benoitc - Eso tiene sentido .. ;-)

¡Arreglaré algo la semana que viene y te lo haré saber!

@benoitc -

Puede encontrar el repositorio con instrucciones en el archivo Léame aquí: https://github.com/kramer65/gunicorn-error

por cierto: estoy usando gunicorn versión 18.0

Probablemente algo deba devolver gunicorn.workers.async.ALREADY_HANDLED o gunicorn intentará registrar la solicitud tan pronto como la aplicación regrese de su controlador WSGI. Gunicorn necesita saber, en cambio, que la solicitud ahora es manejada completamente por la aplicación.

Ambos ejemplos en el directorio "examples / websocket" devuelven esta constante desde su controlador WSGI.

@benoitc - ¿El ejemplo para reproducir el error le ayuda a encontrarlo? ¿Puedo ser de alguna otra ayuda para ayudar a resolver esto?

@ kramer65 sí, reproduje el error.

Entonces Gunicorn es un motor WSGI puro y espera una respuesta WSGI que contenga un estado:
https://github.com/benoitc/gunicorn/blob/master/gunicorn/http/wsgi.py#L242

(relacionado con este código: https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/async.py#L103-L119)

Como dijo @tilgovi , puede omitir el manejo de respuesta de gunicorn devolviendo ALREADY_HANDLED

Por lo que leí el código de flash socketio, está envolviendo la aplicación del matraz en socketio.Middleware que a su vez es inheit de engineio.middleware.Middleware :
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py

que devuelven la aplicación wsgi o su propio controlador si encuentra la ruta:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/middleware.py#L45 -L52

Entonces devuelve socketio.Server.handle_request en la ruta de websocket:
https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/flask_socketio/__init__.py#L144

que en sí mismo devuelve engineio.Server.handle_request (muchos departamentos circulares en este proyecto ...):
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L184

En este punto, parece que ni socket.handle_get_request o socket. handle_post_request establecen el estado:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/socket.py#L69 -L96

Y luego puede ocurrir un error aquí:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

ya que puede devolver una respuesta sin haber establecido un estado ni nada. Puedo ver que la actualización usa el mismo objeto websocket que en nuestro ejemplo:
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py

Creo que en lugar de devolver el r final aquí:
https://github.com/miguelgrinberg/python-engineio/blob/master/engineio/server.py#L251 -L252

Probablemente debería devolver ALREADY_HANDLED como allí:
https://github.com/benoitc/gunicorn/blob/master/examples/websocket/websocket.py#L115

De todos modos, solo una suposición, ya que ese código es bastante difícil de leer. Ojalá te ayude.

@ kramer65 avíseme sobre el estado de este boleto para usted de todos modos :)

@benoitc la ALREADY_HANDLED es específica de gunicorn. Eventlet tiene su propia versión de esta constante, definida de una manera diferente: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/wsgi.py#L69.

El r que estaba siguiendo a través del código devuelve ALREADY_HANDLED evenlet cuando finaliza la conexión de websocket. Eventlet lo maneja automáticamente: https://github.com/eventlet/eventlet/blob/2cd5f1d9aea53efb4526e7185017bdcc84732588/eventlet/websocket.py#L135.

Gunicorn debería (creo) reconocer la constante ALREADY_HANDLED eventlet además de la suya propia y manejarla de la misma manera. Creo que solucionará este problema.

Es fantástico si puede solucionar este problema. Estoy ejecutando flask-socketio & gunicorn en mi producción y no quiero perder datos.

Estoy experimentando problemas similares y me preguntaba si hay alguna noticia sobre este tema.

@benoitc - ¿Crees que la sugerencia hecha por @miguelgrinberg arriba (para permitir que Gunicorn reconozca la constante ALREADY_HANDLED de eventlet además de la suya propia y la maneje de la misma manera) es una buena idea?

@ kramer65, si puede encontrar una manera de agregar soporte de manera limpia para eso, creo que tiene sentido que el trabajador de eventlet lo maneje.

En este momento, la lógica para manejar esto está un poco escondida dentro de gunicorn.workers.async.AsyncWorker#handle_request pero tal vez eso podría manejarse indirectamente a través de la propiedad estática que el eventlet worker puede anular, o llamando a un método de instancia para verificar que ya lo haya manejado cualquier trabajador. lógica específica que podría existir, con la clase base haciendo lo que hace ahora.

@tilgovi - Ha pasado un tiempo desde que me enviaste tu mensaje, pero quería responder a esto después de todo. El problema es que llegué a mi límite en lo que puedo hacer por esto. Realmente no tengo ni idea de cómo proceder para resolver esto.

Mientras tanto, mis registros están llenos de mensajes de error como el que se muestra a continuación, así que tengo todas las razones para poner un poco de energía en resolver esto. Simplemente no entiendo completamente cuál es la causa exacta del problema, y ​​mucho menos si entiendo cómo podría resolverlo.

Si alguien quiere ponerse en contacto, me complacerá discutir el tema, y ​​entonces podría ser un poco más útil de lo que soy ahora.

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'

¿Alguno lo arregló? .....

@qwexvf - Desafortunadamente no lo hice. Mis registros todavía se están llenando de errores. :-(

¿Nadie más?

@ kramer65 ya veo. He estado esperando esto durante mucho tiempo, si alguien tiene la solución, ¡compártala con nosotros! ¡Gracias!

¿alguna actualización?

Estoy seguro de que hay formas más limpias de solucionar este problema, pero al menos es un comienzo.

@stefaang gracias, lo intentaré, ¡lo pensé!

¿Cuándo se lanzará la solución para esto en PyPI?

mañana
El viernes 17 de febrero de 2017 a las 16:46, Eddie [email protected] escribió:

¿Cuándo se lanzará la solución para esto en PyPI?

-
Recibe esto porque modificó el estado abierto / cerrado.

Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-280685264 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AAA4ogTRMF7EfR25G6gLrktOdh_iA4Ciks5rdcDYgaJpZM4HbcdP
.

¿Ha sido lanzado?

@benoitc ¿ alguna palabra sobre la actualización que se está enviando a pypi?

@defionscode haré un lanzamiento el jueves por la mañana (mañana).

Excelente gracias
El miércoles 22 de febrero de 2017 a las 11:54 a. M. Benoit Chesneau [email protected]
escribió:

@defionscode https://github.com/defionscode haré un lanzamiento en
jueves por la mañana (mañana).

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/benoitc/gunicorn/issues/1210#issuecomment-281729992 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AEcrYp6QfVpWXhG14f4M-lPDHMn0cFncks5rfGhWgaJpZM4HbcdP
.

¿Se ha publicado esta corrección?

El estado de https://github.com/benoitc/gunicorn/issues/1471 . Será lanzado hoy ...

Este error todavía está sucediendo de mi lado con las últimas versiones 19 y 20 de gunicorn. ¿Se suponía que iba a ser arreglado @benoitc ?

¿Fue útil esta página
0 / 5 - 0 calificaciones