Nest-Py: A Tiny NestJS-Like Framework in Python Powered by FastAPI
I’ve been experimenting with metaprogramming in Python and decided to build a tiny prototype called Nest-Py.
It’s a small framework inspired by NestJS but built on top of FastAPI.
The goal?
To explore how we can bring concepts like controllers, decorators, and dependency injection into Python — similar to how NestJS structures applications in the Node.js ecosystem.
⚡ Disclaimer: This is just an experiment and learning project, not production-ready. But it shows how Python’s flexibility lets us play with framework design.
Why Nest-Py?
FastAPI is already amazing, but it leaves architecture decisions up to you.
NestJS, on the other hand, enforces a modular structure (controllers, services, modules, DI).
Nest-Py tries to combine both worlds:
- Keep the speed and type hints of FastAPI.
- Add structure with decorators, controllers, and a minimal DI context.
Example: Users and Employees
Here’s a small demo with two services (UserService
, EmployeeService
) and two controllers (UserController
, EmployeeController
).
from nest_py import get, controller, ctx # --- Mock Data --- users = { 1: {"username": "alice", "email": "alice@example.com"}, 2: {"username": "bob", "email": "bob@example.com"}, 3: {"username": "charlie", "email": "charlie@example.com"}, } employees = { 101: {"name": "John Doe", "role": "Manager", "salary": 55000}, 102: {"name": "Jane Smith", "role": "Developer", "salary": 48000}, 103: {"name": "Mark Lee", "role": "Designer", "salary": 45000}, } # --- Services --- class UserService: def get_users(self): return users def get_user(self, id: int): return users.get(id, None) class EmployeeService: def get_employees(self): return employees def get_employee(self, id: int): return employees.get(id, None) # --- Controllers --- @controller("/users") class UserController: service: UserService = None @get("/") async def get_users(): return ctx.service.get_users() @get("/{id}") async def get_user(id: int): return ctx.service.get_user(id) @controller("/employees") class EmployeeController: service: EmployeeService = None @get("/") async def get_employees(): return ctx.service.get_employees() @get("/{id}") async def get_employee(id: int): return ctx.service.get_employee(id) from nest_py.core import factory # minimal bootstrap
Top comments (0)