Spaces:
Running
Running
File size: 2,248 Bytes
be754f2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | from contextlib import asynccontextmanager
import logging
from fastapi import FastAPI, File, Form, Query, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from ocr_config import PRELOAD_LANG, normalize_lang
from ocr_engine import get_ocr, is_lang_loaded, loaded_langs, supported_langs
from ocr_service import run_ocr
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
try:
if PRELOAD_LANG:
logger.info("Server startup: preloading PaddleOCR lang=%s...", PRELOAD_LANG)
get_ocr(PRELOAD_LANG)
logger.info("Server startup: PaddleOCR preload completed.")
except Exception:
logger.exception("Startup preload failed.")
yield
app = FastAPI(lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
def home():
return {
"message": "OCR API Running (PaddleOCR)",
"loaded_langs": loaded_langs(),
"supported_langs": supported_langs(),
}
@app.get("/health")
def health(lang: str | None = Query(None)):
safe_lang = normalize_lang(lang)
return {
"ok": True,
"lang": safe_lang,
"loaded": is_lang_loaded(safe_lang),
"loaded_langs": loaded_langs(),
"supported_langs": supported_langs(),
}
@app.get("/wake")
def wake(lang: str = Query("kr")):
safe_lang = normalize_lang(lang)
get_ocr(safe_lang)
return {
"ok": True,
"lang": safe_lang,
"loaded": is_lang_loaded(safe_lang),
"loaded_langs": loaded_langs(),
}
@app.post("/ocr")
async def ocr_process(
file: UploadFile = File(...),
lang: str = Form("kr"),
):
try:
return await run_ocr(file, lang)
except Exception as e:
logger.exception("OCR error.")
return {
"success": False,
"error": str(e),
"error_type": type(e).__name__,
}
# local testing
# if __name__ == "__main__":
# import uvicorn
# uvicorn.run(app, host="0.0.0.0", port=7860)
|