advent22/api/advent22_api/production.py
Jörn-Michael Miehe 89403a8e30 🚧 api: re-scaffolding
- main Dockerfile readability
- use "granian" in production mode
- simpler "production.py" replacing "mini-tiangolo" (gunicorn+unicorn)
2026-02-19 23:45:59 +01:00

58 lines
1.4 KiB
Python

import os
from granian.cli import cli as granian_cli
from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class WorkersSettings(BaseModel):
per_core: int = Field(1, ge=1)
max: int | None = Field(None, ge=1)
exact: int | None = Field(None, ge=1)
@property
def count(self) -> int:
# usage of "or" operator: values here are not allowed to be 0
base = self.exact or (self.per_core * (os.cpu_count() or 1))
return min(base, self.max or base)
class BindSettings(BaseModel):
host: str = "0.0.0.0"
port: int = 8000
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_prefix="ADVENT22__",
env_nested_delimiter="__",
)
workers: WorkersSettings = WorkersSettings()
bind: BindSettings = BindSettings()
def start():
os.environ["ADVENT22__PRODUCTION_MODE"] = "true"
settings = Settings()
granian_cli(
[
"--host",
settings.bind.host,
"--port",
settings.bind.port,
"--workers",
settings.workers.count,
"--interface",
"asgi",
"--loop",
"uvloop",
"--process-name",
"advent22",
# app
"advent22_api.app:app",
],
auto_envvar_prefix="GRANIAN",
standalone_mode=False,
)