|
|
from datetime import datetime |
|
|
from fastapi import FastAPI, Request |
|
|
from fastapi.staticfiles import StaticFiles |
|
|
from fastapi.responses import HTMLResponse |
|
|
from fastapi.templating import Jinja2Templates |
|
|
from starlette.middleware.trustedhost import TrustedHostMiddleware |
|
|
|
|
|
from src.api.endpoints import demo |
|
|
from src.api.endpoints import search |
|
|
from src.config import config |
|
|
from src.lifespan import lifespan, DEV_MODE |
|
|
|
|
|
|
|
|
from src.utils.bibliography import format_citation, format_bibliography, get_bibtex_entry |
|
|
|
|
|
app = FastAPI(title=config.app.name, version=config.app.version, lifespan=lifespan) |
|
|
|
|
|
|
|
|
@app.middleware("http") |
|
|
async def proxy_headers_middleware(request: Request, call_next): |
|
|
if "x-forwarded-proto" in request.headers: |
|
|
request.scope["scheme"] = request.headers["x-forwarded-proto"] |
|
|
response = await call_next(request) |
|
|
return response |
|
|
|
|
|
app.mount("/static", StaticFiles(directory="./public"), name="static") |
|
|
|
|
|
app.include_router(demo.router, prefix="/api/v1/demo", tags=["demo"]) |
|
|
app.include_router(search.router, prefix="/api/v1/search", tags=["search"]) |
|
|
|
|
|
templates = Jinja2Templates(directory="./src/templates") |
|
|
templates.env.globals["config"] = config |
|
|
templates.env.globals["DEV_MODE"] = DEV_MODE |
|
|
templates.env.globals["current_year"] = datetime.now().year |
|
|
|
|
|
if DEV_MODE: |
|
|
templates.env.globals["hot_reload"] = lambda: getattr(app.state, 'hot_reload', None) |
|
|
else: |
|
|
templates.env.globals["hot_reload"] = lambda: None |
|
|
|
|
|
templates.env.filters["cite"] = format_citation |
|
|
templates.env.filters["bibliography"] = format_bibliography |
|
|
templates.env.filters["bibtex"] = get_bibtex_entry |
|
|
|
|
|
@app.get("/", response_class=HTMLResponse) |
|
|
async def read_root(request: Request): |
|
|
return templates.TemplateResponse( |
|
|
"pages/index.jinja", { |
|
|
"request": request, |
|
|
"title": "Home", |
|
|
"search_result": [], |
|
|
"queries": [], |
|
|
} |
|
|
) |
|
|
|
|
|
|
|
|
@app.get("/demo", response_class=HTMLResponse) |
|
|
async def read_demo(request: Request): |
|
|
return templates.TemplateResponse( |
|
|
"pages/demo/demo.jinja", {"request": request, "title": "Taylor-Russell Model Calculator"} |
|
|
) |