Add template fastapi app, test, README.md, this can be used for future extension

This commit is contained in:
dongli 2025-05-11 19:15:41 -07:00
parent 50087c95be
commit c4c34e6cd7
41 changed files with 47 additions and 61 deletions

View File

@ -2,12 +2,19 @@ This is a template backend service based on fastapi + mongodb app
To start development in local, go to the root directory of the project YOUR_WORKSPACE_PATH/devops/ To start development in local, go to the root directory of the project YOUR_WORKSPACE_PATH/devops/
```bash ```bash
cd scripts/mongodb docker compose -f app/scripts/mongodb/docker-compose.yml up -d
docker compose -f scripts/mongodb/docker-compose.yml up -d
``` ```
Then run the app Then run the app
```bash ```bash
uvicorn main:app --reload uvicorn app.main:app --reload
```
In case a new dependency is added, run the following command to update the requirements.txt file
```bash
# optional: if you have not installed pipreqs
pip3 install pipreqs
# generate requirements.txt
pipreqs . --force
``` ```

View File

@ -2,14 +2,14 @@ import logging
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi from fastapi.openapi.utils import get_openapi
from providers import common from app.providers import common
from providers.logger import register_logger from app.providers.logger import register_logger
from providers import router from app.providers import router
from providers import database from app.providers import database
from providers import metrics from app.providers import metrics
from providers import probes from app.providers import probes
from providers import exception_handler from app.providers import exception_handler
from common.config.app_settings import app_settings from app.common.config.app_settings import app_settings
def create_app() -> FastAPI: def create_app() -> FastAPI:
logging.info("App initializing") logging.info("App initializing")

View File

@ -0,0 +1,3 @@
from app.common.daos.hello_world.hello_world_dao import HelloWorldDao
hello_world_dao = HelloWorldDao()

View File

@ -1,4 +1,4 @@
from common.models.hello_world.hello_world import HelloWorld from app.common.models.hello_world.hello_world import HelloWorld
class HelloWorldDao: class HelloWorldDao:
def __init__(self): def __init__(self):

View File

@ -1,5 +1,5 @@
from .base_logger import LoggerBase from .base_logger import LoggerBase
from common.config.app_settings import app_settings from app.common.config.app_settings import app_settings
class ApplicationLogger(LoggerBase): class ApplicationLogger(LoggerBase):
def __init__(self, application_activities: dict[str, any] = {}) -> None: def __init__(self, application_activities: dict[str, any] = {}) -> None:

View File

@ -1,5 +1,5 @@
from loguru import logger as guru_logger from loguru import logger as guru_logger
from common.config.log_settings import log_settings from app.common.config.log_settings import log_settings
from typing import Dict, Any, Optional from typing import Dict, Any, Optional
import socket import socket
import json import json
@ -9,7 +9,7 @@ import sys
import inspect import inspect
import logging import logging
from common.log.json_sink import JsonSink from app.common.log.json_sink import JsonSink
class LoggerBase: class LoggerBase:
binded_loggers = {} binded_loggers = {}

View File

@ -0,0 +1,4 @@
from app.common.models.hello_world.hello_world import HelloWorld
# list of beanie document models
db_models = [HelloWorld]

View File

View File

View File

@ -1,6 +1,6 @@
from fastapi.responses import RedirectResponse from fastapi.responses import RedirectResponse
from common.config.site_settings import site_settings from app.common.config.site_settings import site_settings
from bootstrap.application import create_app from app.bootstrap.application import create_app
app = create_app() app = create_app()

View File

View File

@ -1,5 +1,5 @@
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from common.config.site_settings import site_settings from app.common.config.site_settings import site_settings
def register(app): def register(app):

View File

@ -1,9 +1,9 @@
import asyncio import asyncio
from common.config.app_settings import app_settings from app.common.config.app_settings import app_settings
from beanie import init_beanie from beanie import init_beanie
from motor.motor_asyncio import AsyncIOMotorClient from motor.motor_asyncio import AsyncIOMotorClient
from common.models import db_models from app.common.models import db_models
from common.probes import ProbeResult from app.common.probes import ProbeResult
client = AsyncIOMotorClient( client = AsyncIOMotorClient(
app_settings.APP_MONGODB_URI, app_settings.APP_MONGODB_URI,

View File

@ -1,5 +1,4 @@
from loguru import logger as guru_logger from app.common.log.base_logger import LoggerBase
from common.log.base_logger import LoggerBase
def register_logger(): def register_logger():

View File

@ -1,6 +1,6 @@
import logging import logging
from prometheus_fastapi_instrumentator import Instrumentator from prometheus_fastapi_instrumentator import Instrumentator
from common.config.app_settings import app_settings from app.common.config.app_settings import app_settings
def register(app): def register(app):
instrumentator = ( instrumentator = (

View File

@ -1,5 +1,5 @@
from common.probes import ProbeManager, ProbeType from app.common.probes import ProbeManager, ProbeType
from common.probes.adapters import FastAPIAdapter from app.common.probes.adapters import FastAPIAdapter
from .database import check_database_initialized from .database import check_database_initialized
def register(app): def register(app):

View File

@ -1,4 +1,4 @@
from routes import api_router from app.routes import api_router
from starlette import routing from starlette import routing

View File

@ -1,5 +1,5 @@
from fastapi import APIRouter from fastapi import APIRouter
from routes.hello_world import router as hello_world_router from app.routes.hello_world import router as hello_world_router
api_router = APIRouter() api_router = APIRouter()

View File

@ -1,7 +1,7 @@
from fastapi import APIRouter from fastapi import APIRouter
from loguru import logger from loguru import logger
from common.daos.hello_world import hello_world_dao from app.common.daos.hello_world import hello_world_dao
router = APIRouter() router = APIRouter()

View File

@ -1,3 +0,0 @@
from common.daos.hello_world.hello_world_dao import HelloWorldDao
hello_world_dao = HelloWorldDao()

View File

@ -1,4 +0,0 @@
from common.models.hello_world.hello_world import HelloWorld
# list of beanie document models
db_models = [HelloWorld]

View File

@ -1,30 +1,10 @@
annotated-types==0.7.0
anyio==4.9.0
beanie==1.29.0 beanie==1.29.0
click==8.2.0
dnspython==2.7.0
exceptiongroup==1.3.0
fastapi==0.115.12 fastapi==0.115.12
h11==0.16.0
httptools==0.6.4
idna==3.10
lazy-model==0.2.0
loguru==0.7.3 loguru==0.7.3
motor==3.7.0 motor==3.7.0
prometheus-fastapi-instrumentator==7.1.0 prometheus_fastapi_instrumentator==7.1.0
prometheus_client==0.21.1 pydantic_settings==2.9.1
pydantic==2.11.4 pytest==7.1.2
pydantic-settings==2.9.1
pydantic_core==2.33.2
pymongo==4.12.1
python-dotenv==1.1.0
PyYAML==6.0.2
sniffio==1.3.1
starlette==0.46.2 starlette==0.46.2
toml==0.10.2
typing-inspection==0.4.0
typing_extensions==4.13.2
uvicorn==0.34.2 uvicorn==0.34.2
uvloop==0.21.0 httpx==0.24.0
watchfiles==1.0.5
websockets==15.0.1

View File