Skip to main content

A service management framework

Project description

Nautica V3

PyPI Version Python License PyPI Downloads

Nautica3 is a backend platform for Python. It gives you a managed runtime environment with a service registry, lifecycle system, CLI, and built-in tools, saving you time from putting your app together and giving you more time to build it.

Features

  • Service Registry A System for managing plugins and their lifecycle and runtime. You can install 3rd party packages from the Package Registry, or drop in .py files into plugins/.

  • Built-in Services Includes the HTTP and WebSocket server, scheduler and more. Everything can be configured or disabled entirely.

  • Config Manager A TOML configuration system with auto key management, live read and writes.

  • Log Manager Provides a readable console and file output. Automatically resolves module from which it is being called.

  • Shell Gives you a way to interact with the server. Additionally you can use the TUI to view all the workers and running threads.

And more! Learn more


I made Nautica because I was solving the same problems in my projects, those being: configs, logging, figuring out startup orders, not to mention the validation boilerplate on every route. Because of this I made Nautica V2, which solved many of these issues, and V3 to improve on the idea.

Get Started

Firstly, install Nautica:

pip install nautica

To create a project, use the Nautica CLI (docs):

nautica create my-project --demo
cd my-project
nautica run

Or continue working on an already existing project by installing it:
cd my-project
nautica install

This will automatically download all needed packages and create associated configuration files/


How Nautica Compares

Benchmark Performance

Framework Requests/Second Avg Latency Overall
Nautica3 3929 2.5ms Baseline
FastAPI 3154 3.2ms 24% slower, 19% higher latency
Flask 75 132.6ms 50x slower, 98% higher latency

More in-depth report is available here

Code Complexity

Similarly to SvelteKit, Nautica defines the route names for you. This helps to reduce boilerplate (see Flask and FastAPI examples), improve readability, and helps with naming conventions

Nautica3

# file: src/http/api/v1/auth.py
from napi.http import HTTP, Context, Reply, Error
from somewhere import username, password

@HTTP.POST()
@HTTP.Require(body = {"username": str, "password": str})
def login(ctx: Context):
    if ctx.body["username"] == username and ctx.body["password"] == password:
        return Reply(ok=True)
    raise Error(401, "Invalid credentials")

Flask

# file: main.py
from flask import Flask, request
from flask.blueprints import Blueprint
import json
from somewhere import username, password

app = Flask(__name__)
v1auth = Blueprint("v1auth", __name__, url_prefix="/api/v1/auth")

@v1auth.post("/login")
def login():
    data = request.get_json(silent=True) or {}
    if data.get("username") == username and data.get("password") == password:
        return json.dumps({"ok": True})

    return json.dumps({"ok": False, "error": "Invalid credentials"}), 401

app.register_blueprint(v1auth)
app.run(port=8101)

Flexibility

Request Validation

FastAPIs Pydantic models are fine..

from pydantic import BaseModel

class ListUsersModel(BaseModel):
    format: str
    limit: int

@app.get("/api/users")
async def list_users(body: ListUsersModel):
    ...

But Nautica's Requirement system gives you more freedom:

from napi.http import HTTP, Context, Require

@HTTP.POST()
@HTTP.Require( body = {"format": Require.AnyOf("dict", "list"), "limit": int} )
async def users(ctx: Context):
    ...

Which gives you access to default type checking + 6 Requirement validators:

AnyOf(*options: any), AnyTypeOf(*types: type), ExactMatch(match: any), RegExMatch(regex: str), File(max_size?: int, mime?: str) and ListOf(obj: type | dict | Requirement, max_length?: int, max_length?: int).

You can implement your custom validators on top of the system, learn more on the wiki.

Response Validation

Similarly, FastAPI uses type hints to determine the response of a route..

from pydantic import BaseModel

class AuthResponse:
    session: str

@app.post("api/auth/login")
def login(body: LoginBody) -> AuthResponse:
    ...

Nautica instead uses a decorator-based approach:

from napi.http import HTTP, Context, Error, ReplyModel

@HTTP.POST()
@HTTP.Responses(
    ReplyModel(200, {"session": str}),
    Error(401)
)
def login(ctx: Context):
    ...

If you want to prevent faulty responses, you can use the strict mode:

@HTTP.Responses(
    ...,
    strict = True
)
# Cancels all responses that don't conform to a schema defined above

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nautica-3.2.3.tar.gz (53.0 kB view details)

Uploaded Source

Built Distribution

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

nautica-3.2.3-py3-none-any.whl (65.9 kB view details)

Uploaded Python 3

File details

Details for the file nautica-3.2.3.tar.gz.

File metadata

  • Download URL: nautica-3.2.3.tar.gz
  • Upload date:
  • Size: 53.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for nautica-3.2.3.tar.gz
Algorithm Hash digest
SHA256 7801813d02c8c3f2e53cd70480efb02fb6729cfdef4857e63cb24fcff6013c66
MD5 21f2c3605ca21786696da28cd3e59ec3
BLAKE2b-256 091ff865cf8acd5bd573bbcb670088eea9b991e7493e9c0ee4b955e497e7b6e8

See more details on using hashes here.

File details

Details for the file nautica-3.2.3-py3-none-any.whl.

File metadata

  • Download URL: nautica-3.2.3-py3-none-any.whl
  • Upload date:
  • Size: 65.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for nautica-3.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 8eea94539a81d5adbc6ca623219eb92072b1b4f80912357977d0be4f0c71b196
MD5 d8054d8d1831e21bc958196f9227121e
BLAKE2b-256 62eb671a1b82fe90848d9b6d8da53b7ee16f486e6334c48db7cf78d0df30adb2

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