Source code for monailabel.app

# Copyright (c) MONAI Consortium
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#     http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import pathlib
from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.middleware import Middleware
from fastapi.middleware.cors import CORSMiddleware
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.staticfiles import StaticFiles

from monailabel.config import settings
from monailabel.endpoints import (
    activelearning,
    batch_infer,
    datastore,
    infer,
    info,
    login,
    logs,
    model,
    ohif,
    proxy,
    scoring,
    session,
    train,
    wsi_infer,
)
from monailabel.interfaces.utils.app import app_instance, clear_cache

origins = [str(origin) for origin in settings.MONAI_LABEL_CORS_ORIGINS] if settings.MONAI_LABEL_CORS_ORIGINS else ["*"]
print(f"Allow Origins: {origins}")


[docs]@asynccontextmanager async def lifespan(app: FastAPI): print("App Init...") instance = app_instance() instance.server_mode(True) instance.on_init_complete() yield print("App Shutdown...")
app = FastAPI( title=settings.MONAI_LABEL_PROJECT_NAME, openapi_url="/openapi.json", docs_url=None, redoc_url="/docs", lifespan=lifespan, middleware=[ Middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) ], ) static_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "endpoints", "static") project_root_absolute = pathlib.Path(__file__).parent.parent.resolve() app.mount( "/static", StaticFiles(directory=os.path.join(project_root_absolute, "monailabel", "endpoints", "static")), name="static", ) if settings.MONAI_LABEL_AUTH_ENABLE: app.include_router(login.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(info.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(model.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(infer.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(wsi_infer.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(batch_infer.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(train.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(activelearning.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(scoring.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(datastore.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(logs.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(ohif.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(proxy.router, prefix=settings.MONAI_LABEL_API_STR) app.include_router(session.router, prefix=settings.MONAI_LABEL_API_STR)
[docs]@app.get("/", include_in_schema=False) async def custom_swagger_ui_html(): html = get_swagger_ui_html(openapi_url=app.openapi_url, title=app.title + " - APIs") body = html.body.decode("utf-8") body = body.replace("showExtensions: true,", "showExtensions: true, defaultModelsExpandDepth: -1,") return HTMLResponse(body)
[docs]@app.get("/favicon.ico", include_in_schema=False) async def favicon(): return FileResponse(os.path.join(static_dir, "favicon.ico"), media_type="image/x-icon")
[docs]@app.post("/reload", include_in_schema=False) def reload(): clear_cache() return {}