summarizer_space / main.py
student2222333051's picture
Update main.py
41edee5 verified
# main.py
import os
import logging
from fastapi import FastAPI, UploadFile, File, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
from starlette.status import HTTP_400_BAD_REQUEST, HTTP_500_INTERNAL_SERVER_ERROR
from summarizer import generate_summary
from pdf_reader import extract_text_from_pdf
# Логтау
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("summarizer_app")
app = FastAPI(title="Scientific Article Summarizer")
# CORS (frontend ↔ backend)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# Статикалық файлдар — жобаның түбірінен береді
app.mount("/static", StaticFiles(directory="."), name="static")
@app.get("/")
async def root():
return FileResponse("index.html")
@app.post("/summarize/text")
async def summarize_text(data: dict):
text = data.get("text", "")
if not text or not text.strip():
raise HTTPException(status_code=HTTP_400_BAD_REQUEST, detail="No text provided.")
try:
summary = generate_summary(text)
return {"summary": summary}
except Exception as e:
logger.exception("Error while generating text summary")
raise HTTPException(status_code=HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
MAX_PDF_BYTES = int(os.getenv("MAX_PDF_BYTES", 10 * 1024 * 1024)) # 10 MB default
@app.post("/summarize/pdf")
async def summarize_pdf(file: UploadFile = File(...)):
if not file.filename.lower().endswith(".pdf"):
raise HTTPException(status_code=HTTP_400_BAD_REQUEST, detail="Only PDF files are supported.")
pdf_bytes = await file.read()
if len(pdf_bytes) == 0:
raise HTTPException(status_code=HTTP_400_BAD_REQUEST, detail="Uploaded PDF is empty.")
if len(pdf_bytes) > MAX_PDF_BYTES:
raise HTTPException(status_code=HTTP_400_BAD_REQUEST, detail=f"PDF too large (max {MAX_PDF_BYTES} bytes).")
try:
text = extract_text_from_pdf(pdf_bytes)
if not text or not text.strip():
return {"summary": "PDF is empty or could not be processed."}
summary = generate_summary(text)
return {"summary": summary}
except Exception as e:
logger.exception("Error while processing PDF")
raise HTTPException(status_code=HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
# Custom error handler example
@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc: HTTPException):
return JSONResponse(status_code=exc.status_code, content={"error": exc.detail})