Skip to main content

Nestipy is a Python framework built on top of FastAPI/BlackSheep that follows the modular architecture of NestJS

Project description

Nestipy Logo

Version Python License

Description

Nestipy is a Python framework built on top of FastAPI that follows the modular architecture of NestJS

Under the hood, Nestipy makes use of FastAPI, but also provides compatibility with a wide range of other libraries, like Blacksheep, allowing for easy use of the myriad of third-party plugins which are available.

Getting started

    pip install nestipy-cli
    nestipy new my_app
    cd my_app
    nestipy start --dev
    ├── src
    │    ├── __init__.py
    ├── app_module.py
    ├── app_controller.py
    ├── app_service.py
    ├── main.py
    ├── cli.py
    ├── pyproject.yml
    ├── uv.lock
    ├── README.md
    
       

The main.py file contains an instance of the application and bootstraps it with app.listen() (Granian under the hood).

from granian.constants import Interfaces

from nestipy.core import NestipyFactory

from app_module import AppModule

app = NestipyFactory.create(AppModule)

if __name__ == '__main__':
    app.listen(
        "main:app",
        host="0.0.0.0",
        port=8000,
        interface=Interfaces.ASGI,
        reload=True,
    )

Embed mode (no import string, fewer options like reload/workers):

if __name__ == '__main__':
    app.listen(host="0.0.0.0", port=8000)

Inside module, we got,

from app_command import AppCommand
from app_controller import AppController
from app_service import AppService

from nestipy.common import Module


@Module(
    controllers=[AppController],
    providers=[AppService, AppCommand]
)
class AppModule: ...

For controller, we got something like

from typing import Annotated

from nestipy.common import Controller, Get, Post, Put, Delete
from nestipy.ioc import Inject, Body, Param

from app_service import AppService


@Controller()
class AppController:
    service: Annotated[AppService, Inject()]

    @Get()
    async def get(self) -> str:
        return await self.service.get()

    @Post()
    async def post(self, data: Annotated[dict, Body()]) -> str:
        return await self.service.post(data=data)

    @Put("/{app_id}")
    async def put(
        self, app_id: Annotated[int, Param("app_id")], data: Annotated[dict, Body()]
    ) -> str:
        return await self.service.put(id_=app_id, data=data)

    @Delete("/{app_id}")
    async def delete(self, app_id: Annotated[int, Param("app_id")]) -> None:
        await self.service.delete(id_=app_id)

And, for app_service.py

from nestipy.common import Injectable


@Injectable()
class AppService:
    @classmethod
    async def get(cls):
        return "test"

    @classmethod
    async def post(cls, data: dict):
        return "test"

    @classmethod
    async def put(cls, id_: int, data: dict):
        return "test"

    @classmethod
    async def delete(cls, id_: int):
        return "test"

Typed TypeScript Client

Generate a typed TypeScript HTTP client straight from your controllers so any JS/TS frontend can call your API with full typing:

nestipy run client:gen --output clients/api_client.ts --class ApiClient
import { createApiClient } from "./api_client";

const api = createApiClient({ baseUrl: "/api" });
const cat = await api.CatsController.getCat(1); // fully typed, grouped by controller

See Typed Client for the full guide.

Web Frontends with Inertia

For server-driven pages, Nestipy ships a first-class Inertia.js adapter (nestipy-inertia) with full protocol parity — partial reloads, deferred props, merge props, history encryption and SSR. See Inertia.

Documentation

View full documentation from here.

Support

Nestipy is an MIT-licensed open source project. It can grow thanks to the sponsors and support from the amazing backers. If you'd like to join them, please [read more here].

Stay in touch

License

Nestipy is MIT licensed.

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

nestipy-0.10.1.tar.gz (6.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nestipy-0.10.1-py3-none-any.whl (6.1 MB view details)

Uploaded Python 3

File details

Details for the file nestipy-0.10.1.tar.gz.

File metadata

  • Download URL: nestipy-0.10.1.tar.gz
  • Upload date:
  • Size: 6.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.21

File hashes

Hashes for nestipy-0.10.1.tar.gz
Algorithm Hash digest
SHA256 7ed1920dcf67e83e38c53a015a9b249cd439427a918316024450ea1620d0c3e5
MD5 7369a8b808285f6efff3dc9e3afe4c98
BLAKE2b-256 418a569b8c7b5802bdfb4c095775136f4a8e7dfaedfb4d7e2a5862357aad92da

See more details on using hashes here.

File details

Details for the file nestipy-0.10.1-py3-none-any.whl.

File metadata

  • Download URL: nestipy-0.10.1-py3-none-any.whl
  • Upload date:
  • Size: 6.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.21

File hashes

Hashes for nestipy-0.10.1-py3-none-any.whl
Algorithm Hash digest
SHA256 604ad945ba9802f54cd638799ecf73c6a1765f855a14007ea703be34e5596590
MD5 e802d072009621bfaface8b4b31528c2
BLAKE2b-256 f0853f8e990d32d92e9e8b40125dff715e1516734de61a4c9024517659dfcba3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page