Skip to main content

Jetio

Jetio Logo

The Zero-Boilerplate Python Framework for Rapid API Development

PyPI version Python versions Compatibility Tests Coverage Status License

Jetio is a modern, high-performance Python web framework designed to transform your SQLAlchemy models directly into fully-featured, production-ready REST APIs with minimal code. Stop writing boilerplate and start building what matters.

Instalation

pip install jetio

Key Features

  • Model-Driven APIs: Use standard SQLAlchemy models as your single source of truth for your database, validation, and API serialization.
  • Automatic CRUD: Instantly generate robust Create, Read, Update, and Delete endpoints for any model with a single line of code.
  • Secure by Design: Easily secure your auto-generated endpoints with a single flag and plug in your own authentication logic.
  • Async First: Built from the ground up on an async core (powered by Starlette) for maximum performance and scalability.
  • Automatic Docs: Get interactive and functional Swagger UI out of the box.
  • Flexible & Familiar: Escape the generator whenever you need to. Use familiar decorator-based routing for custom endpoints, giving you the best of both worlds.


Simple Hello Jetio app

from jetio import Jetio
app = Jetio()

@app.route('/')
async def hello():
    return "Hello, Jetio!"

if __name__ == '__main__':
    app.run()

Activating swagger-UI for Hello Jetio app

from jetio import Jetio, add_swagger_ui # add the add_swagger_ui

app = Jetio()
add_swagger_ui(app) # generates the swagger-UI

@app.route('/')
async def hello():
    return "Hello, Jetio!"

if __name__ == '__main__':
    app.run()

Example - Using models in separate file

# model.py
from sqlalchemy.orm import Mapped
from jetio import JetioModel

class User(JetioModel):
    username: Mapped[str]
    email: Mapped[str]

class Minister(JetioModel):
    first_name: Mapped[str]
    last_name: Mapped[str]

Get Jetio to make your app with imported models

# app.py
from jetio import Jetio, CrudRouter, add_swagger_ui
from model import User, Minister

app = Jetio()
add_swagger_ui(app)

# Generate 5 CRUD routes per model
CrudRouter(model=User).register_routes(app)
CrudRouter(model=Minister).register_routes(app)


if __name__ == "__main__":
    app.run()

Database setup

Use your preferred DB tool.

or for quick dev environment, you can also change your app.py above to:

# app.py
from jetio import Jetio, CrudRouter, add_swagger_ui, Base, engine
from model import User, Minister
import asyncio

app = Jetio()
add_swagger_ui(app)

# Generate 5 CRUD routes per model
CrudRouter(model=User).register_routes(app)
CrudRouter(model=Minister).register_routes(app)


# --- Database and Server Startup ---
async def create_db_and_tables():
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    print("Database tables created.")

if __name__ == "__main__":
    asyncio.run(create_db_and_tables())
    app.run()

Simplified Single File Setup

You could simply have the model classes in the main file as follows.

from jetio import Jetio, CrudRouter, JetioModel, add_swagger_ui, Base, engine
import asyncio
from sqlalchemy.orm import Mapped

class Staff(JetioModel):
    username: Mapped[str]
    email: Mapped[str]

class Report(JetioModel):
    title: Mapped[str]
    content: Mapped[str]

app = Jetio()
add_swagger_ui(app)

# Generate 5 CRUD routes per model
CrudRouter(model=Staff).register_routes(app)
CrudRouter(model=Report).register_routes(app)


# --- Database and Server Startup ---
async def create_db_and_tables():
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    print("Database tables created.")

if __name__ == "__main__":
    asyncio.run(create_db_and_tables())
    app.run()

The CrudRouter is a powerful tool that allows you to cleanly declare your API's functionality, saving you from writing hundreds of lines of boilerplate code.

Relationship

Jetio relationship prevents N+1 Query - Built-in relationship loading using SQLAlchemy's selectinload() prevents performance bottlenecks automatically.

One-to-many Relationship

# app.py
from jetio import Jetio, CrudRouter, JetioModel, add_swagger_ui, Base, engine
from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from typing import List
import asyncio

#===================================================================
# Models - you can have this in a separate file, however you desire.
#===================================================================
class Author(JetioModel):
    __tablename__ = 'authors'
    name: Mapped[str]
    email: Mapped[str]
    books: Mapped[List["Book"]] = relationship(back_populates="author", cascade="all, delete-orphan")


class Book(JetioModel):
    __tablename__ = 'books'
    title: Mapped[str]
    isbn: Mapped[str]
    author_id: Mapped[int] = mapped_column(ForeignKey("authors.id"))
    author: Mapped["Author"] = relationship(back_populates="books")
#===========================================
# end of models
# =========================================

app = Jetio()
add_swagger_ui(app)

CrudRouter(model=Author, load_relationships=["books"]).register_routes(app)
CrudRouter(model=Book, load_relationships=["author"]).register_routes(app)

async def init_db():
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    print("✅ Database initialized")

if __name__ == "__main__":
    asyncio.run(init_db())
    print("🚀 Server running at http://localhost:8000")
    print("📚 API docs at http://localhost:8000/docs")
    app.run()

Our Philosophy

Boilerplate code is a barrier between a great idea and a finished product. Modern development should be about defining your logic, not endlessly reimplementing the plumbing. Jetio believes in convention over configuration and the power of using a single source of truth. Your data model is your API.

Contributing

Contributions are welcome! Please feel free to submit a pull request, open an issue, or provide feedback.

License

This project is licensed under the BSD 3-Clause license.

Release files for jetio 1.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jetio 1.2.3
File Size Uploaded
jetio-1.2.3.tar.gz 39.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jetio 1.2.3
File Interpreter ABI Platform
jetio-1.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 71.4 kB

Release files / jetio-1.2.3.tar.gz

Download URL jetio-1.2.3.tar.gz
Size 39.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4beba8d916aab561fb3d053b8ddd669c29985e853b89835e4502ded9698a9297
BLAKE2b-256 checksum
How to use checksums
2739fc6e5f43bbb2f676afa87d3c3839502d1c5da4eda0bedafa7579bbaa93c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / jetio-1.2.3-py3-none-any.whl

Download URL jetio-1.2.3-py3-none-any.whl
Size 32.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
516182a4e8c41e145c8b139b43530063ea28be0023ad2182ecea8889f8024169
BLAKE2b-256 checksum
How to use checksums
0d4393f5edb8a3d64a70d16205b3054a8fd1a3e8d1b6a48b1cc29ec6e314ffe2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release history Release notifications | RSS feed

2.0.0

2 release files

This release

1.2.3 This release

2 release files

1.2.2

2 release files

1.2.1

1 release file

1.2.0

2 release files

1.1.0

2 release files

1.0.6

2 release files

1.0.5

1 release file

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page