Files
crawle-snapp/admin/main.py
T
2026-08-03 00:27:56 +03:30

59 lines
1.5 KiB
Python

"""FastAPI admin application."""
from __future__ import annotations
import os
import subprocess
import sys
from pathlib import Path
from fastapi import FastAPI
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles
from admin.models import init_db
from admin.routes import router
app = FastAPI(title="Seed Admin", docs_url=None, redoc_url=None)
app.include_router(router)
_STATIC = Path(__file__).parent / "static"
app.mount("/static", StaticFiles(directory=str(_STATIC)), name="static")
_rq_worker: subprocess.Popen[bytes] | None = None
@app.on_event("startup")
def on_startup() -> None:
global _rq_worker
init_db()
if os.environ.get("SKIP_INTERNAL_WORKER", "").lower() in ("1", "true", "yes"):
return
redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379/0")
rq_executable = str(Path(sys.executable).with_name("rq"))
_rq_worker = subprocess.Popen(
[rq_executable, "worker", "--url", redis_url, "batch"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
@app.on_event("shutdown")
def on_shutdown() -> None:
if _rq_worker is not None:
_rq_worker.terminate()
try:
_rq_worker.wait(timeout=5)
except subprocess.TimeoutExpired:
_rq_worker.kill()
@app.get("/")
def dashboard() -> FileResponse:
return FileResponse(str(_STATIC / "dashboard.html"))
@app.get("/favicon.ico", include_in_schema=False)
def favicon() -> FileResponse:
return FileResponse(str(_STATIC / "favicon.svg"), media_type="image/svg+xml")