70 lines
2.0 KiB
Python
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,
|
|
)
|