App class
=========

.. _app-class:

The :class:`~micropie.App` class is the core of a MicroPie application.
It implements the ASGI call interface and dispatches HTTP, WebSocket
and lifespan events to your handlers.  Subclass :class:`~micropie.App`
and add public methods to create route handlers.  Instantiate your
subclass and pass the resulting object to an ASGI server such as
Uvicorn.

Constructor
-----------

.. class:: App(session_backend=None)

   Create a new application.  If *session_backend* is provided it must
   be an instance of :class:`~micropie.SessionBackend`.  When omitted,
   MicroPie uses an in‑memory back‑end.

Attributes
----------

.. attribute:: middlewares

   A list of :class:`~micropie.HttpMiddleware` instances.  Middlewares
   run before and after every HTTP request.  Append a middleware
   instance to enable it.  See :doc:`../howto/middleware` for examples.

.. attribute:: ws_middlewares

   A list of :class:`~micropie.WebSocketMiddleware` instances used for
   WebSocket connections.

.. attribute:: session_backend

   The active :class:`~micropie.SessionBackend` instance used to load
   and save session dictionaries for both HTTP and WebSocket flows.

.. attribute:: startup_handlers

   A list of asynchronous callables that run during the ASGI
   ``lifespan.startup`` event.  Use this to set up resources such as
   database connections.  See :doc:`../tutorial/quickstart` for an
   example.

.. attribute:: shutdown_handlers

   A list of asynchronous callables that run during the ASGI
   ``lifespan.shutdown`` event.  Use this to clean up resources.

Methods
-------

.. method:: __call__(scope, receive, send)

   The ASGI entry point.  Dispatches to HTTP, WebSocket or lifespan
   handlers based on ``scope['type']``.  You normally do not call this
   directly; the ASGI server calls it for you.

.. attribute:: request

   The current :class:`~micropie.Request` (or
   :class:`~micropie.WebSocketRequest`) stored in a context variable for
   the active request lifecycle.

.. method:: _redirect(location, extra_headers=None)

   Return a tuple ``(302, '', headers)`` representing an HTTP redirect
   to *location*.  Use this helper in your handlers to redirect the
   client.

.. method:: _render_template(name, **kwargs)

   Render a Jinja2 template asynchronously.  Returns a string
   containing the rendered output.  Requires Jinja2 to be installed.
   See :doc:`../howto/templates` for details.

Additionally, MicroPie defines several private helper methods such as
``_parse_cookies`` and ``_send_response``.  These are considered
internal and not part of the public API.  They may change without
notice.
