A simple boilerplate application, including models and schemas and abstract router, for FastAPI with MongoDB
Project description
FastAPI MongoDB Base
A powerful package that provides base classes and utilities for building FastAPI applications with MongoDB. Built on top of FastAPI and Beanie ODM, it offers pre-built CRUD operations, authentication, caching, and more.
✨ Features
- 🚀 Ready-to-use CRUD Operations: Pre-built abstract routers with full CRUD functionality
- 📦 MongoDB Integration: Seamless integration using Beanie ODM
- 🔒 Authentication: Built-in JWT authentication support
- 📝 Type Safety: Pydantic models for request/response validation
- 🔄 Caching: Built-in caching mechanism for improved performance
- 🛠 Background Tasks: Easy background task handling
- 📸 Image Processing: Optional image processing support (requires Pillow)
📦 Installation
pip install fastapi-mongo-base
📄 Documentation
The complete documentation is available at: https://mahdikiani.github.io/fastapi-mongo-base/
You can also ask questions about the project using DeepWiki:
🚀 Quick Start
- Create your schema:
from fastapi_mongo_base.schemas import BaseEntitySchema
class UserSchema(BaseEntitySchema):
email: str
name: str
age: int | None = None
- Create your model:
from fastapi_mongo_base.models import BaseEntity
from .schemas import UserSchema
class User(UserSchema, BaseEntity):
"""User model that inherits from both UserSchema and BaseEntity"""
pass
- Set up your router:
from fastapi_mongo_base.routes import AbstractBaseRouter
from . import models, schemas
class UserRouter(AbstractBaseRouter):
def __init__(self):
super().__init__(model=models.User, schema=schemas.UserSchema)
router = UserRouter().router
- Include in your FastAPI app:
from fastapi import FastAPI
from fastapi_mongo_base.core import app_factory
app = app_factory.create_app()
app.include_router(router, prefix="/api/v1/users")
📚 Available Endpoints
Each router automatically provides these endpoints:
GET /api/v1/users- List all usersPOST /api/v1/users- Create a new userGET /api/v1/users/{id}- Get a specific userPATCH /api/v1/users/{id}- Update a userDELETE /api/v1/users/{id}- Delete a user
🔧 Configuration
Configure your application using environment variables or a settings class:
import dataclasses
import logging
import logging.config
import os
import dotenv
from singleton import Singleton
dotenv.load_dotenv()
@dataclasses.dataclass
class Settings(metaclass=Singleton):
root_url: str = os.getenv("DOMAIN", default="http://localhost:8000")
project_name: str = os.getenv("PROJECT_NAME", default="PROJECT")
base_path: str = "/api/v1"
worker_update_time: int = int(os.getenv("WORKER_UPDATE_TIME", default=180))
testing: bool = os.getenv("DEBUG", default=False)
page_max_limit: int = 100
mongo_uri: str = os.getenv("MONGO_URI", default="mongodb://localhost:27017/")
redis_uri: str = os.getenv("REDIS_URI", default="redis://localhost:6379/0")
app_id: str = os.getenv("APP_ID")
app_secret: str = os.getenv("APP_SECRET")
JWT_CONFIG: str = os.getenv(
"USSO_JWT_CONFIG",
default='{"jwk_url": "https://sso.usso.io/website/jwks.json","type": "RS256","header": {"type": "Cookie", "name": "usso-access-token"} }',
)
@classmethod
def get_coverage_dir(cls):
return cls.base_dir / "htmlcov"
@classmethod
def get_log_config(
cls, console_level: str = "INFO", file_level: str = "INFO", **kwargs
):
log_config = {
"formatters": {
"standard": {
"format": "[{levelname} : {filename}:{lineno} : {asctime} -> {funcName:10}] {message}",
"style": "{",
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": console_level,
"formatter": "standard",
},
"file": {
"class": "logging.FileHandler",
"level": file_level,
"filename": cls.base_dir / "logs" / "app.log",
"formatter": "standard",
},
},
"loggers": {
"": {
"handlers": ["console", "file"],
"level": "INFO",
"propagate": True,
},
"httpx": {
"handlers": ["console", "file"],
"level": "WARNING",
"propagate": False,
},
},
"version": 1,
}
return log_config
@classmethod
def config_logger(cls):
log_config = cls.get_log_config()
if log_config["handlers"].get("file"):
(cls.base_dir / "logs").mkdir(parents=True, exist_ok=True)
logging.config.dictConfig(cls.get_log_config())
🛠️ Advanced Usage
Custom Business Logic
Extend the base router to add custom endpoints:
from fastapi_mongo_base.routes import AbstractBaseRouter
class UserRouter(AbstractBaseRouter):
def __init__(self):
super().__init__(model=models.User, schema=schemas.UserSchema)
@router.get("/me")
async def get_current_user(self):
# Your custom logic here
pass
Background Tasks
Handle background tasks easily:
import asyncio
import logging
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from server.config import Settings
logging.getLogger("apscheduler").setLevel(logging.WARNING)
async def log_something():
logging.info('something')
async def worker():
scheduler = AsyncIOScheduler()
scheduler.add_job(
log_something, "interval", seconds=Settings.worker_update_time
)
scheduler.start()
try:
await asyncio.Event().wait()
except (KeyboardInterrupt, SystemExit):
pass
finally:
scheduler.shutdown()
📋 Requirements
- Python >= 3.9
- FastAPI >= 0.65.0
- Pydantic >= 2.0.0
- MongoDB
- Beanie ODM
🔍 Project Structure
fastapi_mongo_base/
├── core/ # Core functionality and configurations
├── models.py # Base models and database schemas
├── routes.py # Abstract routers and endpoints
├── schemas.py # Pydantic models for request/response
├── tasks.py # Background task handling
└── utils/ # Utility functions and helpers
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
📝 License
Distributed under the MIT License. See LICENSE for more information.
👤 Author
- Mahdi Kiani - GitHub
🙏 Acknowledgments
- FastAPI team for the amazing framework
- MongoDB team for the powerful database
- Beanie team for the excellent ODM
- All contributors who have helped shape this project
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_mongo_base-1.0.42.tar.gz.
File metadata
- Download URL: fastapi_mongo_base-1.0.42.tar.gz
- Upload date:
- Size: 83.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0854cb5f4298b966722bcbb2aceaff4161e1d35df24da9ec4faf6307e273fbdb
|
|
| MD5 |
fe8326910e16114f47ae05b5e72f18a4
|
|
| BLAKE2b-256 |
fb43e177017cd9774d8c776fc7cdaa459eb772bf371f78450f3cc530972b502f
|
File details
Details for the file fastapi_mongo_base-1.0.42-py3-none-any.whl.
File metadata
- Download URL: fastapi_mongo_base-1.0.42-py3-none-any.whl
- Upload date:
- Size: 80.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ed843b298a3f75a1866809861b23a768250c72739343eb61b7ff4a4c32e3727
|
|
| MD5 |
548e55453036aa70014d1a0f49a2b71a
|
|
| BLAKE2b-256 |
c74834cc60a5ff25b1198216bcbe032d8b938024018e04bf274e36069aa8e4e0
|