Ошибка значения: оболочка WSGI получила область, отличную от HTTP, при преобразовании приложения Flask Wsgi в приложение Asgi

#python-3.x #flask #wsgi #asgi

Вопрос:

Я разрабатываю веб-сервер с использованием flask 2.0.2 и развертываю его с использованием hypercorn. Я хочу развернуть его как приложение asgi.

Мой main.py выглядит это так:

  from flask import Flask from asgiref.wsgi import WsgiToAsgi  app = Flask(__name__)  @app.get("/") async def hello_word():  await asyncio.sleep(1)  return "lt;pgt; Hello World lt;/pgt;"  asgi_app = WsgiToAsgi(app)  

При развертывании сервера: hypercorn main:asgi_app Возникает следующая ошибка, но сервер успешно развернут.

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

Я могу попасть по определенному маршруту, но причина этой ошибки мне все еще неизвестна. Изучив трассировку стека, я обнаружил, что при развертывании функции handle_lifespan в hypercorn/asyncio/lifespan.py называется, который выглядит так:

 async def handle_lifespan(self) -gt; 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()  

Это определяет тип области как «срок службы» и передает эту область классу WsgiToAsgiInstance, который проверяет область запроса:

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

Может ли кто-нибудь помочь мне лучше понять это?

Ответ №1:

Эту ошибку можно проигнорировать (и в следующем выпуске Hypercorn она будет отображаться как предупреждение вместо этого). Это указывает на то, что вы уже знаете — приложения WSGI не поддерживают протокол lifetime.