diff --git a/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py b/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py index ccc90bb7..be268cd5 100644 --- a/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py +++ b/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py @@ -1,9 +1,5 @@ -from cleo.helpers import option from fastapi_startkit.console.command import Command -from fastapi_startkit.support import Uri - -_DEFAULT_HOST = "127.0.0.1" -_DEFAULT_PORT = 8000 +from cleo.helpers import option class ServeCommand(Command): @@ -41,58 +37,24 @@ class ServeCommand(Command): ), ] - def resolve_host_port(self) -> tuple[str, int]: - """Return (host, port) applying the priority chain: - - CLI --host/--port > APP_HOST/APP_PORT (fastapi.host/port config) - > APP_URL (fastapi.app_url config) > built-in defaults. - """ - from fastapi_startkit import Config - - host = _DEFAULT_HOST - port = _DEFAULT_PORT - - # Layer 1: APP_URL — parse host and port from the URL when set. - app_url = Config.get("fastapi.app_url", "") or "" - if app_url: - # Bare hosts like "myapp.com:9000" have no scheme; add one so - # urlparse can extract hostname and port correctly. - normalised = app_url if "://" in app_url else f"http://{app_url}" - parsed = Uri.of(normalised) - if parsed.host(): - host = parsed.host() - if parsed.port(): - port = parsed.port() - - # Layer 2: APP_HOST / APP_PORT environment variables (via config fields). - cfg_host = Config.get("fastapi.host", "") or "" - cfg_port = Config.get("fastapi.port", 0) or 0 - if cfg_host: - host = cfg_host - if cfg_port: - port = int(cfg_port) - - # Layer 3: CLI flags win over everything. - cli_host = self.option("host") - cli_port = self.option("port") - if cli_host: - host = cli_host - if cli_port: - port = int(cli_port) - - return host, port - def handle(self): import uvicorn - from fastapi_startkit import Config from fastapi_startkit.container import Container - host, port = self.resolve_host_port() - + # Resolve server settings: CLI flag > fastapi config > uvicorn default (None) + cfg_host = Config.get("fastapi.host", "127.0.0.1") + cfg_port = Config.get("fastapi.port", 8000) + cfg_reload = Config.get("fastapi.reload", True) cfg_reload_dirs = Config.get("fastapi.reload_dirs") or None cfg_reload_excludes = Config.get("fastapi.reload_excludes") or None - reload = Config.get("fastapi.reload", True) if self.option("reload") is None else self.option("reload") + + host = self.option("host") or cfg_host + port = int(self.option("port") or cfg_port) + reload = cfg_reload if self.option("reload") is None else self.option("reload") + app = self.option("app") + + exist = self.is_app_exist() kwargs = { "host": host, @@ -101,10 +63,10 @@ def handle(self): "ws": "websockets-sansio", } - if self.is_app_exist(): + if exist: kwargs.update( { - "app": self.option("app"), + "app": app, "factory": True, } ) @@ -113,7 +75,7 @@ def handle(self): if cfg_reload_excludes is not None: kwargs["reload_excludes"] = cfg_reload_excludes - self.line(f"Starting Uvicorn server on {host}:{port} [{self.option('app')}]...") + self.line(f"Starting Uvicorn server on {host}:{port} [{app}]...") else: self.line(f"Starting Uvicorn server on {host}:{port}...")