Add SQLite passive income dashboard with Excel import and deployment tools
This commit is contained in:
+35
-10
@@ -1,16 +1,41 @@
|
||||
import sqlite3
|
||||
from contextlib import asynccontextmanager
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlsplit
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
app = FastAPI(title="Finance Dashboard")
|
||||
templates = Jinja2Templates(directory="/app/templates")
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from database import initialize
|
||||
from routes import dashboard, income, export
|
||||
|
||||
|
||||
@app.get("/", response_class=HTMLResponse)
|
||||
async def index(request: Request):
|
||||
return templates.TemplateResponse(request=request, name="index.html")
|
||||
@asynccontextmanager
|
||||
async def lifespan(app):
|
||||
initialize()
|
||||
yield
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
async def health():
|
||||
return {"status": "ok"}
|
||||
app = FastAPI(title='Finance Dashboard', lifespan=lifespan)
|
||||
app.mount('/static', StaticFiles(directory=Path(__file__).parent / 'static'), name='static')
|
||||
app.include_router(dashboard.router)
|
||||
app.include_router(income.router)
|
||||
app.include_router(export.router)
|
||||
|
||||
|
||||
@app.middleware('http')
|
||||
async def protect_forms(request: Request, call_next):
|
||||
if request.method == 'POST':
|
||||
origin = request.headers.get('origin')
|
||||
if request.headers.get('sec-fetch-site') == 'cross-site' or (origin and urlsplit(origin).netloc != request.headers.get('host')):
|
||||
return HTMLResponse('Fremder Formularursprung ist nicht erlaubt.', status_code=403)
|
||||
return await call_next(request)
|
||||
|
||||
|
||||
@app.exception_handler(sqlite3.OperationalError)
|
||||
async def database_error(request, error):
|
||||
return HTMLResponse('<html lang="de"><meta charset="utf-8"><h1>Datenbank vorübergehend nicht verfügbar</h1><p>Bitte in einigen Sekunden erneut versuchen.</p><a href="/">Zum Dashboard</a></html>', status_code=503, headers={'Retry-After': '5'})
|
||||
|
||||
|
||||
@app.get('/health')
|
||||
def health():
|
||||
return {'status': 'ok'}
|
||||
|
||||
Reference in New Issue
Block a user