-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
88 lines (65 loc) · 2.52 KB
/
app.py
File metadata and controls
88 lines (65 loc) · 2.52 KB
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
"""FastAPI 應用主程式"""
import os
from fastapi import FastAPI, HTTPException, Request
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from core.security import init_security
from models import init_db
from routers.admin import router as admin_router
from routers.dashboard import router as dashboard_router
from routers.imports import router as imports_router
from routers.grading import router as grading_router
from routers.results import router as results_router
from routers.files import router as files_router
from utils import ensure_upload_dir
UPLOAD_FOLDER = "uploads"
PAGE_SIZE = 50
DEFAULT_RUBRIC = {"cr1": 0.0, "cr2": 0.0, "cr3": 0.0, "cr4": 0.0}
def _load_default_rubric_from_env():
raw = os.getenv("DEFAULT_RUBRIC", "").strip()
if not raw:
return DEFAULT_RUBRIC.copy()
parts = [p.strip() for p in raw.split(",")]
if len(parts) != 4:
return DEFAULT_RUBRIC.copy()
try:
values = [float(p) for p in parts]
except ValueError:
return DEFAULT_RUBRIC.copy()
if any(v < 0 or v > 100 for v in values):
return DEFAULT_RUBRIC.copy()
return {
"cr1": values[0],
"cr2": values[1],
"cr3": values[2],
"cr4": values[3],
}
app = FastAPI(title="筆記評分系統")
templates = Jinja2Templates(directory="templates")
init_security(app, templates)
app.state.templates = templates
app.state.upload_folder = UPLOAD_FOLDER
app.state.page_size = PAGE_SIZE
app.state.default_rubric = _load_default_rubric_from_env()
ensure_upload_dir(UPLOAD_FOLDER)
os.makedirs("static", exist_ok=True)
app.mount("/static", StaticFiles(directory="static"), name="static")
app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")
app.include_router(dashboard_router)
app.include_router(imports_router)
app.include_router(grading_router)
app.include_router(results_router)
app.include_router(files_router)
app.include_router(admin_router)
@app.on_event("startup")
def on_startup():
init_db()
@app.exception_handler(404)
async def not_found_exception_handler(request: Request, exc: HTTPException):
return templates.TemplateResponse("404.html", {"request": request}, status_code=404)
@app.exception_handler(500)
async def server_error_exception_handler(request: Request, exc: Exception):
return templates.TemplateResponse("500.html", {"request": request, "error_msg": str(exc)}, status_code=500)
if __name__ == "__main__":
import uvicorn
uvicorn.run("app:app", host="127.0.0.1", port=5000, reload=True)