Протокол срока службы ASGI не поддерживается
У меня есть асинхронный код, работающий на fastapi и aiofiles, я пытаюсь загрузить и сохранить свою информацию из файла.json, но каждый раз, когда я закрываю программу, он сохраняет только ключи dict и показывает мне "срок жизни ASGI ' протокол появляется неподдерживаемый "массаж
это моя часть включения / выключения:
@app.on_event("startup")
async def startup_event():
global beers
try:
async with aiofiles.open("data.json", mode='r+', json=True) as file:
beers = await file.read()
except:
beers = {}
@app.on_event("shutdown")
async def on_exit_app():
async with aiofiles.open("data.json", "w+") as outfile:
await outfile.write(beers)
есть идеи, в чем проблема?
3 ответа
This 99% means that something in the
on_event("shutdown")
function throws an error that isn't caught by the server (FastAPI/Starlette), and the app crashes, instead of ending properly. This leads uvicorn to believe that the server doesn't support the livespan part of the ASGI protocol.
If you run
uvicorn
with additional option
--lifespan on
, the error will be shown and you can debug it.
See Starlette bug report.
У меня была такая же ошибка в приложении Django. Когда сервер запускается, он вроде работает хорошо, но появляется сообщение[INFO] ASGI 'lifespan' protocol appears unsupported
появляется.
(authentication-py3.11) ml@192 authentication % python -m gunicorn "authentication.asgi:application"
[2023-04-12 10:07:28 -0300] [2900] [INFO] Starting gunicorn 20.1.0
[2023-04-12 10:07:28 -0300] [2900] [INFO] Listening at: http://0.0.0.0:8000 (2900)
[2023-04-12 10:07:28 -0300] [2900] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2023-04-12 10:07:28 -0300] [2902] [INFO] Booting worker with pid: 2902
[2023-04-12 13:07:29 +0000] [2902] [INFO] Started server process [2902]
[2023-04-12 13:07:29 +0000] [2902] [INFO] Waiting for application startup.
[2023-04-12 13:07:29 +0000] [2902] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2023-04-12 13:07:29 +0000] [2902] [INFO] Application startup complete.
Следуя решению этой проблемы, я создал собственный рабочий uvicorn, отключающий протокол продолжительности жизни.
рабочие.py
from typing import Any, Dict
from uvicorn.workers import UvicornWorker as BaseUvicornWorker
class UvicornWorker(BaseUvicornWorker):
CONFIG_KWARGS: Dict[str, Any] = {"loop": "auto", "http": "auto", "lifespan": "off"}
Gunicorn.conf.py
from myapp import settings
port = int(settings.APPLICATION_PORT)
bind = f"0.0.0.0:{port}"
workers = int(settings.GUNICORN_WORKERS)
worker_class = "myapp.workers.UvicornWorker"
accesslog = "-"
Это просто утверждение, которое вы можете опустить, насколько я понимаю, вы используете Uvicorn в качестве HTTP-сервера, поскольку FastAPI построен на основе ASGI-фреймворка, а Uvicorn - это HTTP-сервер ASGI, на нем есть несколько протоколов. Протокол ASGI поддерживает http, websocket.
Uvicorn устанавливает ценность жизни в
auto
и утверждение исходит оттуда.
if self.config.lifespan == "auto":
msg = "ASGI 'lifespan' protocol appears unsupported."
Но вы можете использовать
--lifespan on
чтобы исправить это.