52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
# Copyright 2016-2020 Christoph Reiter
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import os
|
|
import asyncio
|
|
from contextlib import asynccontextmanager
|
|
from typing import AsyncIterator
|
|
|
|
from fastapi import FastAPI, Request
|
|
|
|
from .web import webapp, check_is_ready
|
|
from .api import api
|
|
from .utils import logger
|
|
from .fetch.update import update_loop
|
|
|
|
|
|
_background_tasks = set()
|
|
|
|
|
|
# https://github.com/tiangolo/fastapi/issues/1480
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
|
|
if not os.environ.get("NO_UPDATE_THREAD"):
|
|
task = asyncio.create_task(update_loop())
|
|
_background_tasks.add(task)
|
|
task.add_done_callback(_background_tasks.discard)
|
|
yield
|
|
|
|
|
|
app = FastAPI(openapi_url=None, lifespan=lifespan)
|
|
webapp.mount("/api", api, name="api")
|
|
app.mount("/", webapp)
|
|
|
|
|
|
# https://github.com/tiangolo/fastapi/issues/1472
|
|
if not os.environ.get("NO_MIDDLEWARE"):
|
|
app.middleware("http")(check_is_ready)
|
|
|
|
|
|
@webapp.exception_handler(Exception)
|
|
async def webapp_exception_handler(request: Request, exc: Exception) -> None:
|
|
import traceback
|
|
logger.error(''.join(traceback.format_tb(exc.__traceback__)))
|
|
raise exc
|
|
|
|
|
|
@api.exception_handler(Exception)
|
|
async def api_exception_handler(request: Request, exc: Exception) -> None:
|
|
import traceback
|
|
logger.error(''.join(traceback.format_tb(exc.__traceback__)))
|
|
raise exc
|