Как известно, в великом множестве веб-фрейморков, существующих в экосистеме Python, очень легко заблудиться. С одной стороны, большой выбор - это хорошо, но с другой - это так же и бремя, так как приходится тратить усилия на поиски лучшего или хотя бы как можно более подходящего для конкретно ваших условий и задач, а потом и на сравнение и выбор среди найденного. Кто-то выбирает Django, кто-то FastApi, Flask, Tornado, Bottle... да мало ли их? Все мы очень любим то, что на слуху и то, к чему уже привыкли. Привычка - вторая натура. Однако, среди всего этого многообразия есть поистине недооценённые вещи, и с одной из них я хочу вас познакомить.

Sanic - это асинхронный и очень быстрый фрейморк и веб-сервер для построения веб-приложений на основе микросервисной архитектуры. Его создателем является израильский программист Адам Хопкинс, в 2018 году основавший данный проект. С тех пор Sanic постоянно и неустанно развивается. В комьюнити проекта, которое в основном обитает в официальном канале в дискорде, существуют требования к кодстайлу, а также установлена ежеквартальная регулярность релизов, что не может не радовать. На момент написания статьи вышел очередной апдейт версии Sanic - 22.6.0. Также стоит упомянуть, что в начале текущего 2022 года издательством O'Reilly выпущена книга А.Хопкинса "Python Web Development with Sanic".

... хорошая девочка Лида.
Да чем же она хороша?
© Я.Смеляков

Sanic - это ASGI-сервис, со всеми вытекающими отсюда прелестями асинхронной разработки. Для развёртывания в продакшене прекрасно подходит всем известный Uvicorn.

Из коробки Sanic предоставляет возможность писать код как в синхронной, так и в асинхронной парадигме. Для эффективной разработки можно использовать любую версию Python, начиная с 3.7 (если нужна поддержка 3.6, то можно использовать версию 20.12LTS).

Для пользователей Mac и Linux доступны uvloop и ujson. Всё из той же коробки прекрасное и необходимое дополнение - собственный универсальный тестовый клиент для использования с pytest. Автодокументация Redoc и Swagger в форматe OpenAPI3, 4 варианта событий для listeners, middleware для стадий запроса и ответа, инъекции зависимостей, blueprints, расширяемость - что ещё нужно современному программисту?

Ах, да, бонус: простой и понятный синтаксис и полностью типизированные исходники. Ну не прелесть?

Ближе к делу: установка и первое минимальное приложение.

Стандартно делаем pip install sanic

# hello.py

from sanic import Sanic
from sanic.response import json

app = Sanic("my_first_app")

@app.route('/')
async def hello(request):
    return json({'hello': 'world'})

if __name__ == '__main__':
    app.run()

Знакомо, не правда ли? По-моему, когда-то где-то все мы это уже видели... Но плохо ли это? По-моему, очень удобно, синтаксис фреймворка не нужно заучивать с нуля.

К слову о том, что Sanic - это не только фрейморк, но и веб-сервер: запустить данный код из консоли очень просто: sanic hello.app (или же по старинке python3 hello.py)

Затем можно открыть браузер и перейти на http://127.0.0.1:8000/ или вызывать из консоли curl localhost:8000 -i и получить

HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: 5
Content-Length: 17
Content-Type: application/json

{"hello":"world"}

Открыв в браузере страницу http://127.0.0.1:8000/docs мы автоматически попадаем на страницу с документацией Redoc:

http://127.0.0.1:8000/docs
http://127.0.0.1:8000/docs

Swagger же ждёт нас по адресу http://127.0.0.1:8000/docs/swagger :

http://127.0.0.1:8000/docs/swagger
http://127.0.0.1:8000/docs/swagger

И это мы ещё ничего толком не сделали. А главное, всё это можно настроить как нам хочется. Прекрасно? Прекрасно!

Но конечно же это синтетический пример, который не позволяет раскрыть всю прелесть Sanic. В следующих частях шаг за шагом мы посмотрим на его возможности.

P.S. Любителям бенчмарков предлагается перепроверить эти цифры.

Комментарии (3)


  1. andreymal
    12.07.2022 17:51
    +5

    Обе ссылки (/docs и /docs/swagger) пишут ошибку 404.


    Прекрасно?

    Нет, потому что предустановка хлама, которым я не планирую пользоваться, это автоматически плохая идея.


    К счастью, никакой предустановки на самом деле нет: и Redoc, и Swagger входят в состав отдельного пакета sanic-ext, который не устанавливается по умолчанию.


  1. bashkadove
    12.07.2022 21:56

    Книгу выпустило издательство Packt, а не O'Reilly


  1. MARVIIN
    12.07.2022 23:12

    Синтетические тесты в бенчмарках всегда выдают хороший результат, но на деле, увы, это не всегда оказывается правдой