Auto-activate for advanced_alchemy, alembic/, SQLAlchemyAsyncRepositoryService, SQLAlchemyAsyncConfig, repository_type, service_class, filters, or storage. Not for raw SQLAlchemy — use sqlspec.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for litestar_granian, GranianPlugin, litestar run Granian options, runtime threads, HTTP/2, TLS, access logs, metrics, static mounts, or worker lifecycle. Not for non-Granian servers.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
litestar-granian 0.16.0 replaces Litestar's run command with a
supervised Granian command and bridges Litestar's active log formatter into
Granian worker processes. It requires Granian 2.7.9 or later (the current
lock uses 2.8.4).
granian.Granian.GranianPlugin takes only an optional static mode keyword argument ("off" or "auto").litestar run option names documented here. Do not substitute similarly named options from older Granian or Uvicorn releases.from litestar import Litestar, get
from litestar_granian import GranianPlugin
@get("/health")
async def health() -> dict[str, str]:
"""Return health check response."""
return {"status": "ok"}
app = Litestar(
route_handlers=[health],
plugins=[GranianPlugin()],
)
litestar --app app:app run
GranianPlugin registers the Granian-backed run command. When litestar run
starts, litestar-granian inspects the active "litestar" standard-library
logger (or app.logging_config, including standard_lib_logging_config
wrapped by StructlogPlugin), serializes the active formatter into a temporary
JSON dictConfig (--log-config), and reconstructs matching generic
(_granian) and access (granian.access) formatters inside Granian worker
processes.
| Concern | Default |
|---|---|
| Sockets and Bind | 127.0.0.1:8000 |
| HTTP mode | auto (HTTP/1 and HTTP/2 supported; HTTP/3 not supported) |
| Workers | 1 worker (process on GIL builds; thread on free-threaded builds) |
| Runtime threads | 1 per worker |
| Runtime blocking threads | Automatically selected (512 in Granian when unset) |
| Blocking threads | 1 on ASGI (fixed; > 1 only supported on WSGI; 30s idle timeout) |
| Runtime mode | auto (resolves to mt on ASGI) |
| Event loop | auto (Granian's standard selection; optional loops require their extras) |
| Async task implementation | asyncio (optional experimental rust on Python < 3.12) |
| Backlog | 1024 globally (minimum 128) |
| Backpressure | backlog / workers per worker (minimum 1) |
| Granian log | Enabled at info (--granian-log, --granian-log-level) |
| Access log | Disabled (--granian-access-log, --granian-access-log-fmt) |
| WebSockets | Enabled (--ws); automatically disabled in HTTP/2-only mode |
| Process supervision | Supervised process group (always) |
| Reload | Disabled (--reload; not supported on free-threaded Python) |
| Metrics | Disabled; 127.0.0.1:9090 when enabled with --metrics |
| Static-file cache | 86400 seconds; no implicit route or mount |
| Minimum TLS protocol | TLS 1.3 (--ssl-protocol-min [tls1.2|tls1.3]) |
litestar --app app:app run \
--host 0.0.0.0 \
--port 8000 \
--workers 4 \
--runtime-mode auto \
--runtime-threads 1 \
--backpressure 1024 \
--granian-access-log \
--respawn-failed-workers \
--workers-lifetime 4h \
--workers-max-rss 512 \
--metrics \
--metrics-address 127.0.0.1 \
--metrics-port 9090
Use these option families:
| Concern | Options |
|---|---|
| Processes and runtime | --workers (--wc, --web-concurrency, -W), --blocking-threads, --blocking-threads-idle-timeout, --runtime-threads, --runtime-blocking-threads, --runtime-mode, --loop, --task-impl |
| Capacity and flow control | --backlog, --backpressure |
| Protocols | --http [auto|1|2], --ws / --no-ws, --http1-*, --http2-* |
| Granian logging | --granian-log / --granian-no-log, --granian-log-level, --granian-access-log / --granian-no-access-log, --granian-access-log-fmt |
| Litestar logging | --log-config (formatter matching is automatic) |
| TLS & mTLS | --ssl-certificate (--ssl-certfile alias), --ssl-keyfile, --ssl-keyfile-password, --ssl-protocol-min, --ssl-ca, --ssl-crl, --ssl-client-verify / --no-ssl-client-verify, --create-self-signed-cert |
| Worker lifecycle | --respawn-failed-workers / --no-respawn-failed-workers, --respawn-interval, --workers-lifetime, --workers-kill-timeout, --workers-max-rss, --rss-sample-interval, --rss-samples |
| Reload & debug (dev) | --reload (-r), --reload-paths (--reload-dir, -R), --reload-include (-I), --reload-exclude (-E), --reload-ignore-dirs, --reload-ignore-patterns, --reload-ignore-paths, --reload-tick, --reload-ignore-worker-failure, --debug (-d), --pdb (--use-pdb, -P) |
| Operations | --uds (--unix-domain-socket, -U), --uds-permissions, --fd (--file-descriptor, -F), --url-path-prefix, --process-name, --pid-file, --working-dir, --env-files, --metrics / --no-metrics, --metrics-address, --metrics-port, --metrics-scrape-interval |
| Static mounts | Repeatable --static-path-route and --static-path-mount, plus --static-path-dir-to-file and --static-path-expires |
litestar run has one execution model: the Litestar parent enters server
lifespans once and supervises a fresh Granian child process group.
start_new_session=True) and forwards signals (SIGINT, SIGTERM, SIGHUP) to the process group (os.killpg).CREATE_NEW_PROCESS_GROUP) and CTRL_BREAK_EVENT for graceful shutdown, escalating to list-based taskkill only if needed.--workers-kill-timeout plus five seconds (the CLI default is 5 seconds). A second signal or an expired deadline kills the process group.LITESTAR_APP, LITESTAR_HOST, and LITESTAR_PORT, which is how frontend dev-server sidecars (e.g. Vite) learn the real server bind.-F / --fd / --file-descriptor) are supported on POSIX systems (e.g. systemd socket activation).GranianPlugin(static=...) is the plugin's only constructor option:
app = Litestar(route_handlers=[health], plugins=[GranianPlugin(static="auto")])
"off" (the default) keeps Litestar's static routing."auto" lets Granian serve exactly one compatible static provider natively when its configuration is safe, and falls back to Litestar otherwise.--static-path-* CLI mounts always take precedence over either mode. Any other value raises ValueError at construction.Metrics are off by default and are controlled only by --metrics / --no-metrics. --metrics exposes Granian server and worker metrics only at http://<metrics-address>:<metrics-port>/metrics. When no Litestar Prometheus middleware is detected, the command warns that application-level request metrics are not being exported — register Litestar's PrometheusPlugin alongside it when request metrics are desired.
granian.utils.proxies)Granian does not expose --proxy-headers or --forwarded-allow-ips CLI flags. When running behind a reverse proxy that sets X-Forwarded-For and X-Forwarded-Proto, register granian.utils.proxies.wrap_asgi_with_proxy_headers on Litestar(middleware=[...]):
from functools import partial
from granian.utils.proxies import wrap_asgi_with_proxy_headers
from litestar import Litestar
from litestar_granian import GranianPlugin
app = Litestar(
route_handlers=[health],
plugins=[GranianPlugin()],
middleware=[
partial(wrap_asgi_with_proxy_headers, trusted_hosts=["127.0.0.1", "10.0.0.0/8"]),
],
)
Granian can also be executed programmatically directly from Python:
from pathlib import Path
from granian import Granian
from granian.constants import HTTPModes, Interfaces, RuntimeModes
def run_embedded() -> None:
"""Execute Granian embedded server."""
server = Granian(
target="app.server:app",
address="0.0.0.0",
port=8000,
interface=Interfaces.ASGI,
workers=2,
runtime_mode=RuntimeModes.auto,
http=HTTPModes.auto,
ssl_cert=Path("/etc/ssl/certs/app.crt"),
ssl_key=Path("/etc/ssl/private/app.key"),
)
server.serve()
<workflow>
Use GranianPlugin when the project already uses litestar-granian or needs
its Granian-specific CLI, HTTP/2, runtime, worker-lifecycle, metrics, or static
mount controls.
Keep the project's existing ASGI server when its deployment platform, process manager, observability, or operational runbooks depend on that server. Do not replace an established server solely because Granian is available.
Use the bare granian CLI only when deployment tooling intentionally invokes
Granian directly. Its CLI is a separate surface; consult the matching Granian
release instead of copying litestar run options.
pip install "litestar-granian==0.16.0"
Add GranianPlugin() to Litestar(plugins=[...]), then run the application
through litestar --app <module>:<app> run.
0.16.0 always uses supervised execution and matches Granian's formatter to Litestar's automatically. There is no mode to choose:
litestar --app app:app run
--in-subprocess / --no-subprocess and --use-litestar-logger /
--no-litestar-logger are accepted for backwards compatibility, but they are
ignored and print a deprecation warning. Remove them from deployment scripts.
Pass an explicit JSON --log-config only when overriding the automatic
formatter matching completely.
Measure the application before changing workers, runtime threads, or
backpressure. Preserve the auto runtime defaults unless load tests justify a
specific runtime mode.
litestar --app app:app run \
--host 0.0.0.0 \
--port 8000 \
--workers 4 \
--backpressure 1024 \
--granian-access-log
Terminate TLS at the platform proxy when that is the project's established boundary. For Granian-managed TLS, pass both the certificate and key:
litestar --app app:app run \
--ssl-certificate /etc/ssl/certs/app.crt \
--ssl-keyfile /etc/ssl/private/app.key \
--ssl-protocol-min tls1.3
litestar --app app:app run --help
Confirm the required options appear, start the service, exercise health and WebSocket endpoints, and load-test production capacity settings.
</workflow> <guardrails>--runtime-threads, --runtime-blocking-threads, --blocking-threads, and --runtime-mode.--granian-access-log and --granian-access-log-fmt.--granian-access-log vs --access-log).GranianPlugin replaces Litestar's run command; an external ASGI command
still controls its own server lifecycle.--http 2 is selected.--static-path-route with a --static-path-mount.--in-subprocess /
--no-subprocess and --use-litestar-logger / --no-litestar-logger are
ignored in 0.16.0 and emit warnings.--metrics to export request metrics. It exposes Granian
server and worker metrics only; register Litestar's PrometheusPlugin for
application-level request metrics.--blocking-threads greater than 1 on ASGI. Granian fixes
blocking_threads to 1 on ASGI/RSGI and rejects --blocking-threads > 1 with ConfigurationError.--reload or --workers-max-rss on free-threaded Python.
Free-threaded Python builds (GIL disabled) reject these flags with UsageError.granian.utils.proxies.wrap_asgi_with_proxy_headers instead of --proxy-headers or --forwarded-allow-ips.GranianPlugin() is registered when deployment uses litestar run.litestar run --help.--in-subprocess or
--use-litestar-logger compatibility flags.--log-config override.--metrics is paired with Litestar's PrometheusPlugin when application request metrics are required.--reload and --workers-max-rss.Task: Run an existing Litestar application with Granian, enable access logs, configure worker recycling, and expose Granian metrics to a local collector.
from litestar import Litestar, get
from litestar_granian import GranianPlugin
@get("/health")
async def health() -> dict[str, str]:
"""Return application health check status."""
return {"status": "ok"}
app = Litestar(
route_handlers=[health],
plugins=[GranianPlugin(static="auto")],
)
litestar --app app:app run \
--host 0.0.0.0 \
--port 8000 \
--workers 4 \
--runtime-mode auto \
--runtime-threads 1 \
--granian-access-log \
--respawn-failed-workers \
--workers-lifetime 4h \
--workers-max-rss 512 \
--metrics \
--metrics-address 127.0.0.1 \
--metrics-port 9090
--metrics exposes Granian server and worker metrics at http://127.0.0.1:9090/metrics.
Register Litestar's PrometheusPlugin alongside it to also export
application-level request metrics.
litestar run with litestar-granian and standalone granian.granian.Granian and granian.server.embed.Server execution, supervisor architecture, signals, lifespans, and static provider discovery.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Auto-activate for advanced_alchemy, alembic/, SQLAlchemyAsyncRepositoryService, SQLAlchemyAsyncConfig, repository_type, service_class, filters, or storage. Not for raw SQLAlchemy — use sqlspec.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for Litestar, Controller, Router, @get/@post, FromPath, MsgspecDTO, OpenAPIConfig, Provide, FromDishka, Guard, ASGIMiddleware, HTTPException, ChannelsPlugin, or WebSocket. Not for standalone libs.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for Google ADK, LlmAgent, Runner, SQLSpecSessionService, google-genai, AgentRuntime, SpecTree, DynamicWorkflow, FunctionTool, or SSE agent chats. Not for offline ML training.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for litestar_autowire, AutowirePlugin, AutowireConfig, domain_packages, AutowireIntegration, AutowireLoader, or clear_autowire_cache. Not for manual Router composition — use explicit routes.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for uv build, hatch build, PyApp, PYAPP_*, wheel assets, GitHub release matrices, cargo-zigbuild, or python-build-standalone. Not for runtime deployment.
日本語の概要は準備中です。原文の説明を表示しています。
Auto-activate for Dockerfile, compose, Railway, Cloud Run, GKE, systemd, Kubernetes, Terraform, deploy scripts, or granian/litestar run at runtime. Not for packaging artifacts.
日本語の概要は準備中です。原文の説明を表示しています。