CLI === .. |uvicorn| replace:: uvicorn .. _uvicorn: https://www.uvicorn.org/ Litestar provides a convenient command line interface (CLI) for running and managing Litestar applications. The CLI is powered by `click `_, `rich `_, and `rich-click `_. Enabling all CLI features ------------------------- The CLI and its hard dependencies are included by default. However, if you want to run your application (using ``litestar run`` ) or beautify the Typescript generated by the ``litestar schema typescript`` command, you will need |uvicorn|_ and `jsbeautifier `_. They can be installed independently, but we recommend installing the ``standard`` extra which conveniently bundles commonly used optional dependencies. .. code-block:: shell :caption: Install the standard group pip install 'litestar[standard]' Once you have installed ``standard``, you will have access to the ``litestar run`` command. Autodiscovery ------------- Litestar offers autodiscovery of applications and application factories placed within the canonical modules named either ``app`` or ``application``. These modules can be individual files or directories. Within these modules or their submodules, the CLI will detect any instances of :class:`Litestar <.app.Litestar>`, callables named ``create_app``, or callables annotated to return a :class:`Litestar <.app.Litestar>` instance. The autodiscovery follows these lookup locations in order: 1. ``app.py`` 2. ``app/__init__.py`` 3. Submodules of ``app`` 4. ``application.py`` 5. ``application/__init__.py`` 6. Submodules of ``application`` Within these locations, Litestar CLI looks for: 1. An :term:`object` named ``app`` that is an instance of :class:`~.app.Litestar` 2. An object named ``application`` that is an instance of :class:`~.app.Litestar` 3. Any object that is an instance of :class:`~.app.Litestar` 4. A :term:`callable` named ``create_app`` 5. A callable annotated to return an instance of :class:`~.app.Litestar` Specifying an application explicitly ------------------------------------ The application to be used can be specified explicitly via either the ``--app`` argument or the ``LITESTAR_APP`` environment variable. The format for both of them is ``.:``. When both ``--app`` and ``LITESTAR_APP`` are set, the CLI option takes precedence over the environment variable. .. code-block:: bash :caption: Using 'litestar run' and specifying an application factory via --app litestar --app=my_application.app:create_my_app run .. code-block:: bash :caption: Using 'litestar run' and specifying an application factory via LITESTAR_APP LITESTAR_APP=my_application.app:create_my_app litestar run Extending the CLI ----------------- Litestar's CLI is built with `click `_ and can be extended by making use of `entry points `_, or by creating a plugin inheriting from :class:`~.plugins.CLIPlugin`. Using entry points ^^^^^^^^^^^^^^^^^^ Entry points for the CLI can be added under the ``litestar.commands`` group. These entries should point to a :class:`click.Command` or :class:`click.Group`: .. tab-set:: .. tab-item:: setup.py .. code-block:: python :caption: Using `setuptools `_ from setuptools import setup setup( name="my-litestar-plugin", ..., entry_points={ "litestar.commands": ["my_command=my_litestar_plugin.cli:main"], }, ) .. tab-item:: pdm .. code-block:: toml :caption: Using `PDM `_ [project.scripts] my_command = "my_litestar_plugin.cli:main" # Or, as an entrypoint: [project.entry-points."litestar.commands"] my_command = "my_litestar_plugin.cli:main" .. tab-item:: poetry .. code-block:: toml :caption: Using `poetry `_ [project.entry-points."litestar.commands"] my_command = "my_litestar_plugin.cli:main" .. tab-item:: uv .. code-block:: toml :caption: Using `uv `_ [project.entry-points."litestar.commands"] my_command = "my_litestar_plugin.cli:main" Using a plugin ^^^^^^^^^^^^^^ A plugin extending the CLI can be created using the :class:`~.plugins.CLIPlugin`. Its :meth:`~.plugins.CLIPlugin.on_cli_init` will be called during the initialization of the CLI, and receive the root :class:`click.Group` as its first argument, which can then be used to add or override commands: .. code-block:: python :caption: Creating a CLI plugin from litestar import Litestar from litestar.plugins import CLIPlugin from click import Group class MyPlugin(CLIPlugin): def on_cli_init(self, cli: Group) -> None: @cli.command() def is_debug_mode(app: Litestar): print(app.debug) app = Litestar(plugins=[MyPlugin()]) Accessing the app instance ^^^^^^^^^^^^^^^^^^^^^^^^^^ When extending the Litestar CLI, you will most likely need access to the loaded ``Litestar`` instance. You can achieve this by adding the special ``app`` parameter to your CLI functions. This will cause the ``Litestar`` instance to be injected into the function whenever it is called from a click-context. .. code-block:: python :caption: Accessing the app instance programmatically import click from litestar import Litestar @click.command() def my_command(app: Litestar) -> None: ... Using the `server_lifespan` hook ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Server lifespan hooks provide a way to run code before and after the *server* starts and stops. In contrast to the regular `lifespan` hooks, they only run once, even when a server starts multiple workers, whereas `lifespan` hooks would run for each individual worker. This makes them suitable for tasks that should happen exactly once, like initializing a database. .. code-block:: python :caption: Using the `server_lifespan` hook from contextlib import contextmanager from typing import Generator from litestar import Litestar from litestar.config.app import AppConfig from litestar.plugins.base import CLIPlugin class StartupPrintPlugin(CLIPlugin): @contextmanager def server_lifespan(self, app: Litestar) -> Generator[None, None, None]: print("i_run_before_startup_plugin") # noqa: T201 try: yield finally: print("i_run_after_shutdown_plugin") # noqa: T201 def create_app() -> Litestar: return Litestar(route_handlers=[], plugins=[StartupPrintPlugin()]) CLI Reference ------------- The most up-to-date reference for the Litestar CLI can be found by running: .. code-block:: shell :caption: Display the CLI help litestar --help You can also visit the :doc:`Litestar CLI Click API Reference ` for that same information.