diff --git a/.env.example b/.env.example index 341166f..7d3ee2f 100644 --- a/.env.example +++ b/.env.example @@ -35,6 +35,11 @@ CORS_ORIGINS=[] # DB_USER=nene2 # DB_PASSWORD=secret +# レートリミット(APP_ENV=local では未設定時オフ。有効化する場合のみ) +# THROTTLE_ENABLED=true +# THROTTLE_LIMIT=60 +# THROTTLE_WINDOW=60 + # デフォルト値 DB_ADAPTER=sqlite DB_NAME=:memory: diff --git a/src/example/app.py b/src/example/app.py index b52a798..5128d07 100644 --- a/src/example/app.py +++ b/src/example/app.py @@ -115,6 +115,9 @@ def _build_repositories(cfg: AppSettings) -> _Repos: def create_app(settings: AppSettings | None = None) -> FastAPI: cfg = settings or AppSettings() + # Local dev / consumer FT: throttle off unless THROTTLE_ENABLED is set (nene2-python#592). + if cfg.app_env == "local" and os.getenv("THROTTLE_ENABLED") is None: + cfg = cfg.model_copy(update={"throttle_enabled": False}) setup_logging(cfg.app_env) app = FastAPI( diff --git a/tests/example/test_local_throttle_default.py b/tests/example/test_local_throttle_default.py new file mode 100644 index 0000000..f8afeee --- /dev/null +++ b/tests/example/test_local_throttle_default.py @@ -0,0 +1,15 @@ +"""Local example app disables throttle by default (FT / dev ergonomics).""" + +from fastapi.testclient import TestClient + +from example.app import create_app +from nene2.config import AppSettings + + +def test_local_app_allows_burst_without_429() -> None: + cfg = AppSettings(app_env="local") + assert cfg.throttle_enabled is True # settings default; create_app adjusts + client = TestClient(create_app(cfg)) + for _ in range(30): + r = client.get("/examples/ping") + assert r.status_code == 200, r.text