# Getting Started

Sanic Extensions is an *officially supported* plugin developed, and maintained by the SCO. The primary goal of this project is to add additional features to help Web API and Web application development easier.

## Features

- CORS protection
- Template rendering with Jinja
- Dependency injection into route handlers
- OpenAPI documentation with Redoc and/or Swagger
- Predefined, endpoint-specific response serializers
- Request query arguments and body input validation
- Auto create `HEAD`, `OPTIONS`, and `TRACE` endpoints

## Minimum requirements

- **Python**: 3.8+
- **Sanic**: 21.9+

## Install

The best method is to just install Sanic Extensions along with Sanic itself:

```bash
pip install sanic[ext]
```

You can of course also just install it by itself.

```bash
pip install sanic-ext
```

## Extend your application

Out of the box, Sanic Extensions will enable a bunch of features for you. 

.. column::

    To setup Sanic Extensions (v21.12+), you need to do: **nothing**. If it is installed in the environment, it is setup and ready to go.

    This code is the Hello, world app in the [Sanic Getting Started page](../../guide/getting-started.md) _without any changes_, but using Sanic Extensions with `sanic-ext` installed in the background.

.. column::

    ```python
    from sanic import Sanic
    from sanic.response import text

    app = Sanic("MyHelloWorldApp")

    @app.get("/")
    async def hello_world(request):
        return text("Hello, world.")
    ```


.. column::

    **_OLD DEPRECATED SETUP_**

    In v21.9, the easiest way to get started is to instantiate it with `Extend`.

    If you look back at the Hello, world app in the [Sanic Getting Started page](../../guide/getting-started.md), you will see the only additions here are the two highlighted lines.

.. column::

    ```python
    from sanic import Sanic
    from sanic.response import text
    from sanic_ext import Extend

    app = Sanic("MyHelloWorldApp")
    Extend(app)

    @app.get("/")
    async def hello_world(request):
        return text("Hello, world.")
    ```

Regardless of how it is setup, you should now be able to view the OpenAPI documentation and see some of the functionality in action: [http://localhost:8000/docs](http://localhost:8000/docs).
