Application basics ================== First steps ------------ Before we start building our TODO application, let us start with the basics. Install Litestar ++++++++++++++++ To install Litestar, run ``pip install 'litestar[standard]'``. This will install Litestar as well as `uvicorn `_ - a web server to serve your application. .. note:: You can use any ASGI-capable web server, but this tutorial will use - and Litestar recommends - Uvicorn. Hello, world! +++++++++++++ The most basic application you can implement - and a classic one at that - is of course one that prints ``"Hello, world!"``: .. literalinclude:: /examples/todo_app/hello_world.py :language: python :caption: ``app.py`` Now save the contents of this example in a file called ``app.py`` and type ``litestar run`` in your terminal. This will serve the application locally on your machine. Now visit http://127.0.0.1:8000/ in your browser: .. image:: images/hello_world.png Now that we have a working application, let us examine how we got here in a bit more detail. Route handlers --------------- Route handlers tell your Litestar application what to do when it gets a request. They are named this way because they typically handle a single URL path (or *route*), which is the part of the URL that's specific to your application. In our current example, the only route handler we have is for ``hello_world``, and it is using the ``/`` path. .. tip:: For example, if your application has a route for handling requests to the ``/home`` URL path, you would create a route handler function that would be called when a request to that path is received. The first argument to the route handler is the *path*, which in this example has been set to ``/``. This means that the function ``hello_world`` will be called when a request is being made to the ``/`` path of your application. The name of the handler decorator - ``get`` - refers to the HTTP method to which you want to respond. Using ``get`` tells Litestar that you only want to use this function when a ``GET`` request is being made. .. literalinclude:: /examples/todo_app/hello_world.py :language: python :emphasize-lines: 4 :linenos: .. note:: The syntax used in this example (the ``@get`` notation) is called a decorator. It's a function that takes another function as its argument (in this case ``hello_world``) and replaces it with the return value of the decorator function. Without the decorator, the example would look like this: .. code-block:: python async def hello_world() -> str: return "Hello, world!" hello_world = get("/")(hello_world) For an in-depth explanation of decorators, you can read this excellent Real Python article: `Primer on Python Decorators `_ .. seealso:: * :doc:`/usage/routing/handlers` Type annotations ---------------- Type annotations play an important role in a Litestar application. They tell Litestar how you want your data to behave, and what you intend to do with it. .. literalinclude:: /examples/todo_app/hello_world.py :language: python :emphasize-lines: 5 :linenos: In this example, the ``hello_world`` function has a return annotation of ``-> str``. This means that it will return a :class:`string `, and lets Litestar know that you would like to send the return value as-is. .. note:: While type annotations by default don't have any influence on runtime behaviour, Litestar uses them for many things, for example to validate incoming request data. If you are using a static type checker - such as `mypy `_ or `pyright `_ - this has the added benefit of making your applications easy to check and more type-safe. Applications ------------ After a route handler has been defined, it needs to be registered with an application in order to start serving requests. The application is an instance of the :class:`Litestar ` class. This is the entry point for everything, and can be used to register previously defined route handlers by passing a list of them as the first argument: .. literalinclude:: /examples/todo_app/hello_world.py :language: python :emphasize-lines: 9 :linenos: .. seealso:: * :doc:`/usage/applications` Running the application ----------------------- The last step is to actually run the application. Litestar does not include its own HTTP server, but instead makes use of the `ASGI protocol `_, which is a protocol Python objects can use in order to interact with application servers like `uvicorn `_ that actually implement the HTTP protocol and handle it for you. If you installed Litestar with ``pip install 'litestar[standard]'``, this will have included *uvicorn*, as well as the Litestar CLI. The CLI provides a convenient wrapper around uvicorn, allowing you to easily run applications without the need for much configuration. When you run ``litestar run``, it will recognise the ``app.py`` file and the ``Litestar`` instance within it without the need to specify this manually. .. tip:: You can start the server in "reload mode", which will reload the application each time you have made a change to the file. For this, simply pass the ``--reload`` flag as a command line argument: ``litestar run --reload``. .. seealso:: * :doc:`/usage/cli`