FastAPI APP structure

most APP has this folder structure

Application Root

 -- App
    |--- forms
    |---- db connection
    ...
    __init__.py

-- static
-- templates
-- config

App_main.py
config.py
loghanler.py
  1. App — init.py

    import os
    import uvicorn
    from fastapi import FastAPI
    from fastapi.middleware.cors import CORSMiddleware
    from fastapi.staticfiles import StaticFiles
    from starlette_session import SessionMiddleware
    from starlette_wtf import CSRFProtectMiddleware

    app = FastAPI()

    app.add_middleware(

     SessionMiddleware,
     secret_key="SECURE_SECRET_KEY",
     cookie_name="auth_cookie",

    )

    app.add_middleware(CSRFProtectMiddleware, csrf_secret=os.urandom(32))
    app.add_middleware(

     CORSMiddleware,
     allow_origins=["*"],
     allow_credentials=True,
     allow_methods=["*"],
     allow_headers=["*"],

    )

    app.mount(“/static”, StaticFiles(directory=f”{BASE_DIR}\static”), name=”static”)

    def configure_routes():

     app.include_router(home_router)
    

    def main():

     configure_routes()
     uvicorn.run(app, host='0.0.0.0', port=9999)
    
  2. under APP, each API file

import uuid
from typing import List, Optional

from fastapi import APIRouter, Request, Form, BackgroundTasks, Depends
from starlette.responses import RedirectResponse

fistApp_router = APIRouter()

@fistApp_router .get(‘/hello’)
async def hello(request: Request, session: Session = Depends(session_manager.use_session)):

 return templates.TemplateResponse('home/warning.html',{"request": request})

  1. Use jinja2 template, configure some settings in config.py

import os
import typing
from datetime import datetime
from fastapi import Request
from fastapi.templating import Jinja2Templates

BASE_DIR = os.path.abspath(os.path.dirname(__file__))

def get_version_number(filename):

try:
    info = win32api.GetFileVersionInfo(filename, "\\")
    ms = info['FileVersionMS']
    ls = info['FileVersionLS']
    return win32api.HIWORD(ms), win32api.LOWORD(ms), win32api.HIWORD(ls)
except Exception as err:
    logger.info(f"Get version number exception:{err}")
    return 0, 0, 0

def flash(request: Request, message: typing.Any, category: str = “primary”) -> None:

if "_messages" not in request.session:
    request.session["_messages"] = []
    request.session["_messages"].append({"message": message, "category": category})

def get_flashed_messages(request: Request):

return request.session.pop("_messages") if "_messages" in request.session else []

templates = Jinja2Templates(directory=f”{BASE_DIR}\templates”)
templates.env.globals[‘app_name’] = “FastAPI demo”
app_ver = get_version_number(f'{BASE_DIR}\FastAPIDemo.exe’)
templates.env.globals[‘app_ver’] = f'{app_ver[0]}.{app_ver[1]}.{app_ver[2]}’
templates.env.globals[‘copyright_year’] = datetime.utcnow().year

templates.env.globals[‘get_flashed_messages’] = get_flashed_messages