es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de valor: El envoltorio de WSGI recibió un alcance no http al convertir una aplicación Flask Wsgi en una aplicación Asgi.

Estoy desarrollando un servidor web utilizando Flask 2.0.2 y lo estoy implementando usando Hypercorn. Quiero implementarlo como una aplicación ASGI.

Mi main.py se ve así:
“`import asyncio

from flask import Flask
from asgiref.wsgi import WsgiToAsgi

app = Flask(name)

@app.get(“/”)
async def hello_word():
await asyncio.sleep(1)
return “

Hello World

asgi_app = WsgiToAsgi(app)


Cuando implemento el servidor: <code>hypercorn main:asgi_app</code> Se produce el siguiente error, pero el servidor se implementa correctamente.

[2021-11-29 20:15:30 +0530] [41394] [ERROR] ASGI Framework Lifespan error, continuing without Lifespan support
Traceback (most recent call last):
File “/PycharmProjects/MyProject/venv/lib/python3.7/site-packages/hypercorn/asyncio/lifespan.py”, line 32, in handle_lifespan
await invoke_asgi(self.app, scope, self.asgi_receive, self.asgi_send)
File “/PycharmProjects/MyProject/venv/lib/python3.7/site-packages/hypercorn/utils.py”, line 246, in invoke_asgi
await app(scope, receive, send)
File “/PycharmProjects/MyProject/venv/lib/python3.7/site-packages/asgiref/wsgi.py”, line 21, in call
await WsgiToAsgiInstance(self.wsgi_application)(scope, receive, send)
File “/PycharmProjects/MyProject/venv/lib/python3.7/site-packages/asgiref/wsgi.py”, line 36, in call
raise ValueError(“WSGI wrapper received a non-HTTP scope”)
ValueError: WSGI wrapper received a non-HTTP scope
[2021-11-29 20:15:30 +0530] [41394] [INFO] Running on http://127.0.0.1:8000 (CTRL + C to quit)


Puedo acceder a la ruta definida, pero todavía desconozco la causa de este error. Al analizar la pila de rastreo, descubrí que, al implementar, se llama a la función `handle_lifespan` en `hypercorn/asyncio/lifespan.py`, que se ve así:

async def handle_lifespan(self) -> None:
self.started.set()
scope: LifespanScope = {“type”: “lifespan”, “asgi”: {“spec_version”: “2.0”}}
try:
await invoke_asgi(self.app, scope, self.asgi_receive, self.asgi_send)
except LifespanFailureError:
# Lifespan failures should crash the server
raise
except Exception:
self.supported = False
if not self.startup.is_set():
message = “ASGI Framework Lifespan error, continuing without Lifespan support”
elif not self.shutdown.is_set():
message = “ASGI Framework Lifespan error, shutdown without Lifespan support”
else:
message = “ASGI Framework Lifespan errored after shutdown.”

    await self.config.log.exception(message)
finally:
    self.startup.set()
    self.shutdown.set()

Esto define el tipo de ámbito como "lifespan" y pasa este ámbito a la clase WsgiToAsgiInstance que verifica el ámbito de la solicitud:

if scope[“type”] != “http”:
raise ValueError(“WSGI wrapper received a non-HTTP scope”)
“`

Alguien puede ayudarme a entenderlo mejor?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error ocurre al desplegar un servidor web Flask usando Hypercorn e intentando desplegarlo como una aplicación ASGI. A pesar del error, el servidor se despliega exitosamente, y se puede acceder a la ruta definida. Sin embargo, la causa del error no está clara.

    Al mirar la traza de pila, el error ocurre en la función handle_lifespan en el archivo hypercorn/asyncio/lifespan.py. Esta función define el tipo de alcance como “lifespan” y pasa este alcance a la clase WsgiToAsgiInstance. En esta clase, se verifica el alcance de la solicitud y, si no es “http”, se genera un ValueError con el mensaje “WSGI wrapper received a non-HTTP scope”.

    El error sugiere que el servidor está recibiendo un alcance no-HTTP, lo cual no es esperado en el contexto de WsgiToAsgiInstance al ser desplegado como una aplicación ASGI. La causa de este error podría ser debido a una incorrecta implementación de WsgiToAsgiInstance o un problema subyacente en la configuración del servidor. Sin embargo, sin más información, es difícil identificar la causa del error.

Comments are closed.