A service management framework
Project description
Nautica V3
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
.pyfiles intoplugins/. -
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
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 nautica-3.2.2.tar.gz.
File metadata
- Download URL: nautica-3.2.2.tar.gz
- Upload date:
- Size: 52.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e163cff364cfbb3f339d19cabb4c1493e7596c697cbc3980fe12fcddeca9f24
|
|
| MD5 |
215d922ae0127ca1301d321b42a237ea
|
|
| BLAKE2b-256 |
06f6550f9a8a6ddc367f7060c5c77775eeead7b456d6e94287851790409c7c7e
|
File details
Details for the file nautica-3.2.2-py3-none-any.whl.
File metadata
- Download URL: nautica-3.2.2-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59a008d0a793b6a4e56554d3aca9cddd54bfae6107d70017e9bdb847d1b1fe49
|
|
| MD5 |
a8f92d46c638e3b197030ccad7477062
|
|
| BLAKE2b-256 |
72ba63d7e6928cd30f66bd8e3adde1c5de738ddc7811c0785dec6fc140e9536d
|