most APP has this folder structure
Application Root
-- App
|--- forms
|---- db connection
...
__init__.py
-- static
-- templates
-- config
App_main.py
config.py
loghanler.py
-
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 CSRFProtectMiddlewareapp = 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) - 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})
- 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