Для каких проектов лучше всего подходит Flask, а для каких — Django? Какие особенности Flask можно использовать при разработке веб-приложений наиболее эффективно? Я Алексей Некрасов, лидер направления Python в МТС, автор форка библиотеки flask-combo-jsonapi, программный директор курсов по Python в Skillbox, СЕО Forkway и автор канала Python — учим и работаем

Сегодня, пожалуй, уже никто не пишет веб-приложения на Python. Я имею в виду «чистый» Python: в арсенале разработчиков имеются удобные веб-фреймворки, значительно ускоряющие и упрощающие этот процесс. Один из них — Flask. 

Flask против Django

Когда мы говорим о фреймворках для создания веб-приложений на Python, первым в голову приходит Django, о Flask вспоминают далеко не сразу. Действительно, Flask и Django — два синхронных веб-фреймворка, кроме них многие разработчики предпочитают FastAPI из-за его асинхронности и быстродействия. Если провести небольшой анализ вакансий на hh.ru, связанных с веб-разработкой на Python, то увидим, что в 44% случаев от кандидатов ожидается знание Django, в 25% — Flask, а 31% работодателей указывают в требованиях FastAPI. Однако, когда перед нами стоит задача выбрать технологию для собственного пет-проекта, ориентироваться, конечно же, нужно не на рынок вакансий, а на возможности фреймворка, его характерные особенности и на свои знания. Допустим, вы выучили базовый синтаксис Python и хотите быстро разработать веб-сервис для решения какой-либо прикладной задачи. Про асинхронный Python вы слышали, но не знаете, как он работает, а сервис нужен уже завтра. В этом случае имеющиеся знания и навыки несколько ограничивают выбор.

Так почему же Django столь популярен? Тому есть множество причин, но основная заключается в том, что Django можно отнести к категории продуктов «батарейки включены» — то есть он предоставляет множество полезных инструментов и функций «из коробки». Еще два несомненных плюса — это масштабируемость (Django хорош для крупных проектов) и безопасность: этот фреймворк уделяет значительное внимание защите от угроз. Наконец, Django может похвастаться большим сообществом разработчиков, которое обеспечивает проекту всестороннюю поддержку, а также создает немалое количество полезных плагинов и дополнений.

Достоинства Flask

Во-первых, это легковесность: да, фреймворк предоставляет минимальный набор инструментов, но зато позволяет быстро начать разработку, что очень важно для небольших приложений. Во-вторых, Flask идеален для создания микросервисов. Если приложение строится на основе микросервисной архитектуры, реализовать ее намного проще именно с помощью Flask. Кроме того, Flask отлично подходит для создания легковесных API. Если вам знаком только синтаксис Python и при этом требуется быстро интегрировать разрабатываемый проект с другими веб-приложениями либо обеспечить его взаимодействие с существующим API, этот фреймворк — прекрасный выбор для решения задачи. Итак, Flask имеет смысл выбрать по следующим причинам:

  • легковесность: Flask позволяет быстро создавать небольшие веб-приложения;

  • микросервисы: Flask идеален для создания микросервисных архитектур;

  •  API: Flask легко интегрируется с расширениями для создания API;

  • шаблонный движок Jinja2: Мощный и гибкий движок для верстки веб-страниц;

  • независимость от ORM: Flask предоставляет свободу выбора ORM.

Чтобы все сказанное выше не выглядело голословными утверждениями, давайте рассмотрим несколько практических кейсов, чтобы понять, в каких ситуациях лучше использовать Flask, а в каких — Django. Перечислим преимущества и недостатки этих фреймворков для каждого упомянутого нами случая.

Кейс 1: Проверка работы сервера через API

Flask

Плюсы:

  • Быстрый старт. Создание базового API на Flask потребует всего несколько строк кода.

  • Простота и легковесность. Нет лишних зависимостей или настроек.

Минусы:

  • Для более сложных задач потребуется добавление дополнительных расширений.

Django

Плюсы:

  • Больше функциональности «из коробки», например наличие панели администрирования (в данном кейсе она не востребована).

  • Встроенная система аутентификации.

Минусы:

  • Больше начальных настроек по сравнению с Flask.

  • Может быть избыточным для простого API.

Для простой проверки работы сервера с использованием API Flask будет более подходящим выбором из-за его простоты и скорости развертывания.

Кейс 2: Создание маркетплейса

Flask

Плюсы:

  • Гибкость. Выбор компонентов и структуры приложения полностью в руках разработчика.

  • Легковесность. Можно добавлять только те компоненты, которые действительно нужны.

Минусы:

  • Может потребоваться больше времени на разработку из-за необходимости интеграции дополнительных расширений.

  • Риск появления «спагетти-кода» при отсутствии четкой структуры проекта.

Django

Плюсы:

  • Быстрая разработка благодаря множеству встроенных инструментов.

  • Четкая структура проекта снижает риск «спагетти-кода».

  • Встроенная система аутентификации и панель администратора.

Минусы:

  • Меньше гибкости по сравнению с Flask.

  • Может быть избыточным для небольших проектов.

Для создания маркетплейса Django будет предпочтительным выбором в силу наличия большого ассортимента функций «из коробки» и четкой структуры, что ускоряет разработку и снижает риск создания «спагетти-кода».

Итак, давайте подведем предварительный итог. Какие веб-приложения имеет смысл разрабатывать с использованием Flask, а какие все-таки не стоит?

Типы приложений, которые можно создать на Flask:

  • API: Flask идеально подходит для создания RESTful API благодаря легковесности и гибкости фреймворка.

  • Одностраничные приложения (SPA): На Flask можно разработать как backend, так и frontend для SPA (используя Jinja2).

  • Микросервисы: Благодаря своей легковесности Flask часто используется для создания микросервисов.

  • Блоги, CMS и другие традиционные веб-приложения.

  • Прототипирование: быстрое создание прототипов для демонстрации идей или функций.

Типы приложений, которые не рекомендуется создавать на Flask (прежде всего, из-за высокой сложности):

  • Крупные и сложные веб-приложения: для таких приложений может потребоваться более мощный фреймворк, такой, как Django, который предоставляет больше встроенных инструментов и функций.

  • E-commerce: хотя на Flask можно создать интернет-магазин, существуют другие фреймворки и платформы, специально предназначенные для электронной коммерции.

  • Приложения с высокой нагрузкой: Flask может потребовать дополнительной оптимизации и настройки для обработки большого количества запросов в секунду.

Где можно размещать Flask-приложения?

Flask-приложения можно размещать практически на любом хостинге, который поддерживает Python. В эту категорию входят облачные платформы, например «Яндекс Облако», Heroku, а также традиционные VPS и другие хостинги. Для разработки и тестирования Flask обычно использует встроенный сервер Werkzeug. Однако для продакшена рекомендуется использовать более мощные серверы, такие как Gunicorn, uWSGI или mod_wsgi в сочетании с серверами типа Nginx или Apache.

Нужно учитывать, что Flask требует Python версии 3.5 или выше. Также могут потребоваться дополнительные библиотеки и расширения в зависимости от функциональности разрабатываемых приложений.

Цикл разработки приложения и особенности Flask

Backend приложений, реализованных на Flask, имеет ряд характерных архитектурных особенностей, оказывающих влияние на сам процесс и цикл разработки. Во-первых, это модульность: Flask поддерживает разделение приложения на модули, или blueprints, для лучшей организации кода. Во-вторых, фреймворк позволяет создать отдельный файл или модуль для хранения и изменения настроек приложения. В-третьих, расширяемость: Flask дает возможность легко интегрировать сторонние расширения, но об этом следует подумать заранее, желательно — еще до начала цикла разработки.

Прежде чем приступить к созданию приложения на Flask (впрочем, как и на любом другом фреймворке), необходимо пройти ряд подготовительных этапов, которые я перечислил ниже.

  1. Определение требований: четко определите функциональные и нефункциональные требования к backend-части приложения.

  2. Проектирование структуры приложения: определите основные компоненты, модули и их взаимодействие.

  3. Проектирование моделей БД: продумайте структуру данных, связи между таблицами и индексы.

  4. Проектирование API: определите методы, эндпойнты и форматы ответов для взаимодействия с frontend и другими потребителями вашего API.

  5. Выбор инструментов: подумайте, какие дополнительные библиотеки и инструменты будут использоваться (например, базы данных, системы очередей).

  6. Настройка окружения: установите Python, Flask и другие необходимые инструменты. Настройте виртуальное окружение.

Вот теперь можно приступать непосредственно к разработке. Цикл создания веб-приложения с использованием Flask включает в себя 5 этапов:

  1. Планирование: определение требований, проектирование архитектуры, моделей БД и API — эти подготовительные этапы я перечислил выше.

  2. Разработка: непосредственное написание кода.

  3. Тестирование: проверка приложения на наличие ошибок и несоответствий требованиям.

  4. Деплой: развертывание приложения на сервере или в облаке.

  5. Мониторинг и поддержка: отслеживание ошибок, производительности и внесение необходимых изменений.

Если важность первого пункта в целом очевидна — без грамотного планирования процесс разработки рискует очень быстро превратиться в хаос, — а следующие три не требуют пояснений, то на последнем пункте мне хотелось бы остановиться чуть подробнее.

Особенности поддержки и тестирования

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

Для логирования Flask использует стандартную библиотеку Python. Вы можете легко настроить ведение логов таким образом, чтобы сообщения различных уровней сохранялись в файлы, потоки или удаленные системы журналирования, такие как Logstash или Graylog. Кроме того, можно выбрать внешнюю библиотеку loguru, она достаточно хорошо сконфигурирована «из коробки». Сторонние расширения, такие как Flask-Logging, могут предоставить дополнительные возможности, кроме того, в полной мере поддерживается интеграция с Sentry.

Для отладки веб-приложения используется встроенный отладчик, который предоставляет полезную информацию об ошибках в процессе разработки. Главное в продакшене — не забыть его отключить! Также во многих IDE имеются встроенные отладчики, они закрывают около 95% кейсов.

Flask поддерживает модульное тестирование с использованием стандартной библиотеки unittest, но я предпочитаю для этой цели pytest. В архитектуре фреймворка также имеется специальный класс FlaskClient для тестирования приложений на уровне запросов.

Комьюнити

Как поётся в известной детской песенке, вместе весело шагать по просторам. А разрабатывать большие и сложные веб-приложения — еще веселее. Тот же пресловутый Django располагает очень большим сообществом, которое занимается и разработкой, и поддержкой. А как насчет Flask?

Flask имеет одно из самых активных комьюнити среди веб-фреймворков Python. Также для Flask создана обширная документация, доступная на английском языке. Она покрывает все аспекты использования этого фреймворка — от базовых принципов до продвинутых тем.

Благодаря активному сообществу существует множество расширений и плагинов для Flask, которые добавляют дополнительные функции и интеграции. Есть множество форумов, групп и сообществ, где разработчики могут обсудить вопросы, связанные с Flask, самые оживленные можно найти на площадках Stack Overflow и Reddit. Вот несколько ссылок на полезные ресурсы для разработчика на Flask, которые лучше на всякий случай иметь под рукой.

  1. Официальная документация Flask (en).

  2. Flask на GitHub — исходный код, проблемы и обсуждения.

  3. Список расширений для Flask (en).

  4. Awesome Flask (en) — кураторский список полезных библиотек, ресурсов и обучающих материалов.

  5. Мега-Учебник Flask (ru) — обширное руководство по созданию полноценного веб-приложения на Flask.

  6. Python — учим и работаем (ru) — канал в Telegram, на котором я рассказываю про разработку, в том числе и на Flask.

  7. Python Flask (ru) — группа комьюнити в Telegram.

Заключение

Flask — это гибкий и мощный фреймворк с активным сообществом, который подходит для решения разнообразных задач в области веб-разработки. Так, на курсе Python-разработчик в Skillbox обучение фреймворку проходит на примере разработки серверной части социальной сети. Простота и гибкость делают Flask идеальным выбором для индивидуальных проектов и быстрой итерации, в то время как обширные ресурсы и поддержка сообщества обеспечивают качественное развитие и масштабирование приложений.

При этом важно помнить, как и в случае с любым инструментом, что выбор между Flask и другими фреймворками, такими, как Django, должен основываться на специфических требованиях и целях вашего проекта. Flask — это всего лишь технология, которая имеет пусть и очень широкий, но все же ограниченный спектр прикладного применения.

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


  1. OlegSivchenko
    29.09.2023 10:58
    +2

    Интересно, спасибо за источники. Считайте из первых рук тизер/спойлер - в издательстве "БХВ" практически готов перевод книги "The Well-Grounded Python Developer", https://www.manning.com/books/the-well-grounded-python-developer, выход которой в оригинале задержался на полгода именно потому, что туда добавляли материал по Flask


  1. TyVik
    29.09.2023 10:58
    +7

    Простите, но вот выучит человек flask на базе своего pet-проекта и что? Его доля для прода падает с каждым днём. Почему бы не вложиться в тот же Django и показывать проект на собеседованиях?

    Порог входа во Flask лишь в самом начале простой, подключение к бд уже проблема - приходится ещё 2 либы тащить. Что хуже - дальше встаёт вопрос какую из библиотек брать для тех же форм или API. В Django же есть как правило один официально рекомендуемый способ сделать что-то. Да, для прода не всегда подходящий, но новичку это знать и не надо.

    Ну и про легковесность... Когда вы соберёте весь зоопарк, то не факт, что размер будет меньше.


  1. omaxx
    29.09.2023 10:58
    +1

    • Одностраничные приложения (SPA): На Flask можно разработать как backend, так и frontend для SPA (используя Jinja2).

    А можно вот про это поподробнее?


  1. rSedoy
    29.09.2023 10:58
    +4

    ИМХО конечно, но сейчас начиная любой проект, передо мной выбор или Django, или FastAPI. А если говорить про RESTful API, то Flask проигрывает им обоим.

    Flask идеален для создания микросервисов.

    здесь он полностью проигрывает FastAPI, хотя скорее можно заявить, что я не знаю где бы у Flask было преимущество перед FastAPI


  1. nameisBegemot
    29.09.2023 10:58

    Интересная мысль. Но джанга также хорошо поддерживает апи (DRF) и умеет в шаблоны дзиндзя. Также обладает модульностью и расширяемый. Есть и тестирование.

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

    Ну а так да, в минимолизме фласка есть своя фишечка.


  1. tkovacs
    29.09.2023 10:58

    Меня скоро от слова микросервисы тошнить будет