Как известно, в великом множестве веб-фрейморков, существующих в экосистеме 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:
Swagger же ждёт нас по адресу http://127.0.0.1:8000/docs/swagger
:
И это мы ещё ничего толком не сделали. А главное, всё это можно настроить как нам хочется. Прекрасно? Прекрасно!
Но конечно же это синтетический пример, который не позволяет раскрыть всю прелесть Sanic. В следующих частях шаг за шагом мы посмотрим на его возможности.
P.S. Любителям бенчмарков предлагается перепроверить эти цифры.
Комментарии (3)
MARVIIN
12.07.2022 23:12Синтетические тесты в бенчмарках всегда выдают хороший результат, но на деле, увы, это не всегда оказывается правдой
andreymal
Обе ссылки (/docs и /docs/swagger) пишут ошибку 404.
Нет, потому что предустановка хлама, которым я не планирую пользоваться, это автоматически плохая идея.
К счастью, никакой предустановки на самом деле нет: и Redoc, и Swagger входят в состав отдельного пакета sanic-ext, который не устанавливается по умолчанию.