2024-12-26 14:42:24 +02:00

70 lines
2.0 KiB
Python

import time
from typing import Any, Callable
from fastapi import FastAPI, Request
from setech.utils import get_logger
from starlette import status
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import RedirectResponse, Response
from tortoise.contrib.fastapi import register_tortoise
from service.api.routes import api_router
from service.config import TORTOISE_ORM, settings
from service.utils.web import do_init
do_init()
logger = get_logger("api")
app = FastAPI(
debug=settings.debug,
root_path=settings.root_path,
title=settings.project_name,
version="0.1.0",
servers=[
{"url": "http://localhost:8000/", "description": "Local"},
{"url": "https://test.{{ cookiecutter.project_slug }}.com/", "description": "Staging environment"},
{"url": "https://{{ cookiecutter.project_slug }}.com/", "description": "Production environment"},
],
)
@app.middleware("http")
async def add_process_time_header(request: Request, call_next: Callable[[Any], Any]) -> Response:
start_time = time.time()
if settings.debug:
logger.info(
f"Received request for '{request.url}'",
extra={
"headers": request.headers,
"content": await request.body(),
"cookies": request.cookies,
"url": request.url,
},
)
response: Response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # [str(origin).strip("/") for origin in settings.cors_origins],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(api_router)
@app.get("/", tags=["Root redirect"])
def root_view() -> RedirectResponse:
return RedirectResponse("/docs", status_code=status.HTTP_308_PERMANENT_REDIRECT)
register_tortoise(
app,
config=TORTOISE_ORM,
add_exception_handlers=True,
)