#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.