Django против Flask в 2024 году: какой фреймворк выбрать
Согласно Опросу разработчиков Python, проведенному JetBrains в 2022 году, Django и Flask на сегодняшний день являются двумя самыми популярными веб-фреймворками на Python. Хотя Django традиционно был самым популярным веб-фреймворком на Python, несколько лет назад Flask обошел Django и занял первое место, что неудивительно, учитывая, что за последние восемь или около того лет индустрия веб-разработки перешла на более мелкие фреймворки, микросервисы и "бессерверные" платформы.
Или, возможно, это связано не столько с отраслевыми тенденциями, сколько с пользователями JetBrains?
У Django и Flask развитые сообщества, они широко поддерживаются и популярны и предлагают продуктивные подходы к разработке приложений, позволяя вам сосредоточить свое время и энергию на уникальных частях вашего приложения, а не на основных конструкциях. В конечном счете, оба фреймворка используются для разработки веб-приложений. Ключевое различие заключается в том, как они достигают этой цели. Представьте Django как автомобиль, а Flask - как велосипед. Оба могут доставить вас из пункта А в пункт Б, но их подходы совершенно разные. У каждого из них есть свои лучшие варианты использования. То же самое касается Django и Flask.
В этой статье мы рассмотрим лучшие варианты использования Django и Flask, а также то, что делает их уникальными с точки зрения образования и разработки.
Философия
Django и Flask - это бесплатные веб-фреймворки на основе Python с открытым исходным кодом, предназначенные для создания веб-приложений.
По сравнению с Flask, Django отличается стабильностью, а также подходом "с включенными батарейками", при котором ряд батареек (например, инструменты, шаблоны, функции и функционал) предоставляются "из коробки". С точки зрения стабильности, Django, как правило, имеет более длительные и жесткие циклы выпуска. Таким образом, хотя в релизах Django меньше новых функций, они, как правило, обладают более высокой обратной совместимостью.
Основываясь на Werkzeug, Flask хорошо справляется с основными строительными лесами. В комплекте вы получаете маршрутизацию URL-адресов, обработку запросов и ошибок, создание шаблонов, файлы cookie, поддержку модульного тестирования, отладчик и сервер разработки. Поскольку большинству веб-приложений требуется нечто большее (например, ORM, аутентификация и авторизация, и это лишь некоторые из них), вы сами решаете, как вы хотите создать свое приложение. Независимо от того, используете ли вы сторонние расширения или настраиваете код самостоятельно, Flask не будет вам мешать в этом. Он гораздо более гибкий, чем Django. Кроме того, здесь гораздо меньше открытой для атаки площади и меньше кода для просмотра, если вам нужно взломать капот и посмотреть на исходный код.
Я настоятельно рекомендую вам прочитать и просмотреть Исходный код Flash. Чистый, понятный и сжатый - это отличный пример хорошо структурированного кода на Python.
Особенности
Далее давайте сравним Flask и Django на основе функций, которые поставляются с основными фреймворками.
База данных
Django включает в себя простой, но мощный ORM (Объектно-реляционное отображение), который поддерживает ряд реляционных баз данных, которые находятся за пределамивставка: SQLite, PostgreSQL, MySQL, MariaDB и Oracle. ORM обеспечивает поддержку создания базы данных и управления ею миграциями. Также довольно просто создавать формы, представления и шаблоны на основе моделей данных, что идеально подходит для вашего типичного веб-приложения CRUD. Несмотря на то, что у него есть некоторые недостатки, он достаточно хорош для большинства веб-приложений.
Flask не делает никаких предположений о том, как хранятся данные, но существует множество библиотек и расширений, которые могут помочь в этом:
Use | Library | Extension |
---|---|---|
ORM | SQLAlchemy | Flask-SQLAlchemy |
Migration tool for SQLAlchemy | Alembic | Flask-Alembic |
ORM, Migrations | Peewee | Flask-Peewee |
ORM | PonyORM | Flask-Pony |
ODM (Object Document Mapper) | PyMongo | Flask-PyMongo |
ODM | MongoEngine | Flask-MongoEngine |
В заключение, если вы используете реляционную базу данных, Django значительно упрощает работу, поскольку в нее встроен ORM и инструмент управления миграцией. Однако, если вы используете нереляционную базу данных или хотели бы использовать другой ORM, например SQLAlchemy, Django будет противостоять вам практически на каждом шагу. Кроме того, вы, скорее всего, не сможете воспользоваться преимуществами Django admin, model forms или сериализаторов моделей DRF.
Flask не будет мешать вам, предоставляя вам свободу выбора ORM (или ODM), который лучше всего подходит для вашего приложения. Однако за свободу приходится платить: здесь легче обучаться и больше возможностей для ошибок, поскольку вы сами управляете этими элементами.
Чем больше вы делаете самостоятельно, тем больше ошибок совершаете, особенно по мере масштабирования событий.
Авторизация
Поскольку большинство веб-приложений требуют аутентификации (кто вы?) и авторизация (что вам разрешено делать?), Django предоставляет эту функциональность наряду с управлением учетными записями и поддержкой сеансов (через модель пользователя ) готовый к использованию. Flask поддерживает сеансы на основе файлов cookie, но вам придется обратиться к сети расширений для управления учетной записью, аутентификации и авторизации.
Use | Extension |
---|---|
Account management, Authentication | Flask-Login |
Authorization | Flask-Principal |
Account management, Authentication, Authorization | Flask-Security |
Администратор
Django поставляется с функциональной административной панелью, которая представляет собой веб-приложение, предоставляющее пользовательский интерфейс для управления данными на основе ваших моделей. Это еще одна область, в которой Django преуспевает. Это позволяет вам быстро выполнять CRUD-операции с вашими моделями при создании приложения без написания какого-либо дополнительного кода. Опять же, Flask не поставляется с чем-либо подобным, но расширение Flask-Admin предлагает все те же функциональные возможности и многое другое:
Django многое делает автоматически.
Философия Flask немного отличается - явное лучше неявного. Если что-то должно быть инициализировано, это должен сделать разработчик.
Администратор Flask следует этому соглашению. Вы, как разработчик, должны указывать администратору Flask, что и как должно отображаться.
Иногда это потребует написания небольшого количества шаблонного кода, но в будущем это окупится, особенно если вам придется реализовать некоторую пользовательскую логику.
Flask-Admin поддерживает ряд серверных систем базы данных, таких как SQLAlchemy, Peewee, MongoEngine и многие другие. Вы также можете добавить свои собственные серверные части. Его также можно использовать с популярными расширениями для аутентификации Flask (или без них):
Маршрутизация и просмотры
Оба фреймворка позволяют сопоставлять URL-адреса с представлениями и поддерживают представления на основе функций и классов.
Джанго
Когда запрос соответствует шаблону URL, объект запроса, содержащий информацию о HTTP-запросе, передается в представление, и это представление затем вызывается. Всякий раз, когда вам нужен доступ к объекту запроса, вы должны явно передавать его другим пользователям.
URL-адреса и представления определены в отдельных файлах - urls.py и views.py соответственно.
- Маршрутизация
- Представления
- Представления на основе классов
- Контекст запроса
- Как Django обрабатывает запрос
Фляжка
По своей сути, Flask использует Werkzeug, который обеспечивает маршрутизацию URL-адресов и обработку запросов/ответов.
Объект запроса является глобальным в Flask, поэтому вам будет намного проще получить к нему доступ (если вы его импортируете). URL-адреса обычно определяются вместе с представлением (с помощью декоратора), но они могут быть выделены в централизованное расположение, аналогичное шаблону Django.
Обратили ли вы внимание на разницу в том, как Django и Flask обрабатывают объект запроса? В общем, Flask, как правило, более четко описывает вещи, но в данном случае все наоборот: Django заставляет вас явно передавать объект запроса, в то время как объект запроса Flask просто волшебным образом доступен. Это одна из самых сложных частей работы с Flask, особенно для тех, кто не знаком с фреймворком, использующим аналогичный фреймворк, такой как Express.js.
Формы
Формы, еще одна важная часть большинства веб-приложений, поставляются в комплекте с Django. Это включает в себя обработку входных данных и проверку на стороне клиента и сервера, а также решение различных проблем безопасности, таких как подделка межсайтовых запросов (CSRF), межсайтовый скриптинг (XSS) и внедрение SQL. Они могут быть созданы на основе моделей данных (с помощью ModelForms) и хорошо интегрированы с административной панелью.
Flask по умолчанию не поддерживает формы, но мощное расширение Flask-WTF объединяет Flask с WTForms. WTForms-Alchemy может использоваться для автоматического создания форм на основе моделей SQLAlchemy, устраняя разрыв между формами и ORM, подобно ModelForm в Django.
Повторно используемые компоненты
Что касается структуры проекта, то по мере усложнения ваших приложений, обе платформы упрощают их разделение, группируя связанные файлы вместе, которые обладают схожей функциональностью. Таким образом, вы могли бы, например, сгруппировать все связанные с пользователем функциональные возможности вместе, которые могут включать маршруты, представления, формы, шаблоны и статические ресурсы.
У Django есть концепция приложения, в то время как у Flask есть чертежа.
Приложения Django более сложны, чем чертежи Flask, но с ними, как правило, проще работать и повторно использовать после настройки. Кроме того, благодаря urls.py, models.py и views.py соглашениям - согласованная структура проекта! -- вы можете довольно легко добавлять новых разработчиков в проект на Django. В то же время Blueprints проще в установке и использовании.
Шаблоны и статические файлы
Шаблонизаторы позволяют динамически вводить информацию в HTML-страницу из серверной части. Flask использует Jinja2 по умолчанию, в то время как у Django есть свой собственный шаблонизатор. Они довольно похожи с точки зрения синтаксиса и наборов функций. Вы также можете использовать Jinja2 с Django.
Оба фреймворка также поддерживают статическую обработку файлов:
Django поставляется с удобной командой управления для сбора всех статических файлов и размещения их в центральном хранилище для производственных развертываний.
Асинхронные просмотры
Django поддерживает асинхронные обработчики с появлением Django 3.1. Просмотр можно сделать асинхронным, используя ключевое слово async
. Поддержка асинхронности доступна также для промежуточных программ. Если вам нужно выполнить асинхронный вызов внутри асинхронного представления, вы можете использовать функцию/декоратор sync_to_async. Это может быть использовано для взаимодействия с другими частями Django, которые еще не поддерживают асинхронность, такими как ORM и уровень кэширования.
Асинхронные веб-серверы, включая, но не ограничиваясь ими, Daphne, Hypercorn, Uvicorn, следует использовать с Django, чтобы использовать всю мощь асинхронных представлений.
Во Flask 2.0 добавлена встроенная поддержка асинхронных маршрутов/просмотров, обработчиков ошибок, функций до и после запроса и обратных вызовов для устранения неполадок!
Подробнее об асинхронных представлениях в Django и Flask читайте в статьях Асинхронные представления в Django и Асинхронные представления во Flask 2.0 соответственно.
Тестирование
Оба фреймворка имеют встроенную поддержку тестирования.
Для модульного тестирования они оба используют фреймворк Python unittest. Каждый из них также поддерживает тестовый клиент, которому вы можете отправлять запросы, а затем проверять и валидировать части ответа.
Смотрите Тестирование приложений Flask и Тестирование в Django соответственно для получения дополнительной информации.
Что касается расширений, если вам нравится, как работает фреймворк unittest, ознакомьтесь с Flask-тестированием. С другой стороны, расширение pytest-flask добавляет поддержку pytest в Flask. Что касается Django, ознакомьтесь с pytest-django.
Другие функции
Есть еще несколько не упомянутых функций, которые поставляются с Django, но не с Flask:
Django | Flask Extension / Resource |
---|---|
Atom and RSS feeds | Atom RSS Feed Generator with Python and Flask |
Caching framework | Flask-Caching |
Bootstrapping tool | Flask-AppBuilder, CLI |
Sitemaps | Flask-Sitemap |
Безопасность
Как уже упоминалось, Django имеет встроенную защиту от ряда распространенных методов атаки, таких как CSRF, XSS и SQL-инъекция. Эти меры безопасности помогают защитить ваш код от уязвимостей. Команда разработчиков Django также активно выявляет и быстро исправляет известные уязвимости в системе безопасности. С другой стороны, у Flask гораздо меньшая база кода, поэтому для атаки остается меньше возможностей. Однако вам необходимо будет выявлять и исправлять уязвимости в коде вашего приложения, созданного вручную, по мере их появления.
В конечном счете, вы защищены настолько, насколько надежно ваше самое слабое звено. Поскольку Flask в гораздо большей степени зависит от сторонних расширений, приложения будут защищены настолько, насколько безопасно наименее защищенное расширение. Это создает дополнительную нагрузку на вашу команду разработчиков, требующую обеспечения безопасности путем оценки и мониторинга сторонних библиотек и расширений. Поддержание их в актуальном состоянии является наиболее важной (и часто самой сложной) задачей, поскольку у каждого расширения есть своя команда разработчиков, документация и циклы выпуска. В некоторых случаях определенное расширение может поддерживаться только одним или двумя разработчиками. При оценке одного расширения по сравнению с другим обязательно изучайте проблемы на GitHub, чтобы узнать, сколько времени обычно требуется разработчикам для устранения критических проблем.
Это не означает, что Django по своей сути более безопасен, чем Flask; просто его проще защитить заранее и поддерживать в течение всего срока службы вашего приложения.
Ресурсы:
- Соображения безопасности колбы
- Безопасность в Django
- Защита веб-приложений Flask
- Защитите Ваше Веб-Приложение Django От Угроз Безопасности
Гибкость
Flask по своей конструкции гораздо более гибкий, чем Django, и он должен быть расширен. Из-за этого настройка Flask обычно занимает больше времени, поскольку вам придется добавлять соответствующие расширения в зависимости от потребностей бизнеса - например, ORM, разрешения, аутентификацию и так далее. Такие первоначальные затраты обеспечивают большую гибкость в будущем для приложений, которые не соответствуют стандартной модели Django.
Однако будьте осторожны с этим. Гибкость дает разработчикам больше свободы и контроля, но это может замедлить разработку, особенно для больших команд, поскольку требуется принять гораздо больше решений.
Разработчикам нравится, что они могут делать все, что им заблагорассудится, для решения проблемы. Поскольку Flash не содержит большого количества ограничений или мнений о том, как разрабатывается приложение, разработчики могут предложить свои собственные. В результате два приложения Flask, которые функционально взаимозаменяемы при параллельном использовании, часто будут иметь различную структуру. Таким образом, вам нужна более зрелая команда, которая понимает шаблоны проектирования, масштабируемость и важность тестирования, чтобы обеспечить такую гибкость.
Образование
Изучайте шаблоны, а не языки или фреймворки.
Независимо от того, является ли вашей конечной целью изучение Flask или Django, начните с Flask. Это отличный инструмент для изучения основ веб-разработки и лучших практик, а также основных элементов веб-фреймворка, которые являются общими практически для всех фреймворков.
- Flask легче и гораздо более понятен, чем Django. Итак, если вы новичок в веб-разработке, но не знакомы с Python, вам будет намного проще разрабатывать на Flask, поскольку вам будет казаться, что вы работаете с vanilla Python, определяя обработчики запросов, представления и тому подобное.
- У Django много накладных расходов. Начиная со структуры проекта и заканчивая настройками и установкой множества деталей, о которых вы ничего не знаете, вы заблудитесь и в конечном итоге узнаете больше о самом Django, чем о реальных основах.
Почти во всех случаях рекомендуется изучить Flask до начала работы с Django. Отступать от этого правила следует только в тех случаях, когда вам просто нужно быстро запустить приложение, чтобы удовлетворить требования какой-либо внешней заинтересованной стороны. Просто не забудьте когда-нибудь вернуться к Flask, чтобы изучить основы.
Открытый исходный код
У Django и Flask сильные сообщества разработчиков с открытым исходным кодом.
Статистика на GitHub по состоянию на 10 января, 2024:
Metric | Django | Flask |
---|---|---|
First commit | 2005 | 2010 |
Contributors | 2,497 | 713 |
Users* | 1,516,997 | 1,642,229 |
Watchers | 2,294 | 2,138 |
Stars | 74,941 | 65,412 |
*количество раз, когда зависимость используется другими репозиториями
Для получения дополнительной информации ознакомьтесь с Сравнением Django и Flask с открытым исходным кодом в Open Hub.
Вопросы о переполнении стека по состоянию на 10 января, 2024:
К какому выводу мы можем прийти?
- Оба сообщества очень активны
- Django старше, и в нем гораздо больше участников
- Flask используется в большем количестве проектов
- На Django появилось больше контента
Чтобы действительно сравнить эти фреймворки (или экосистемы) с точки зрения открытого исходного кода, вам нужно будет использовать Jinja2 и Werkzeug, а также некоторые основные библиотеки Flask и расширения, такие как SQLAlchemy / Flask-SQLAlchemy, перегонный куб / Flask-Alembic и WTForms / Flask-WTF.
Поскольку основные функциональные возможности Flask распределены по нескольким проектам, сообществу сложнее создавать и развивать необходимую синергию между проектами для поддержания динамики. Например, у Flask нет ни одного де-факто существующего расширения для создания RESTful API; по состоянию на январь 2024 года существует (предположительно) четыре популярных расширения:
Более того, чтобы найти эти расширения, вам нужно обладать довольно хорошими навыками поиска информации. Вам придется отфильтровать все доступные расширения и статьи, которые на них ссылаются. На самом деле, существует так много различных проектов расширения для RESTful API, что зачастую проще просто запустить свой собственный и использовать его с открытым исходным кодом. В этот момент вы, вероятно, будете поддерживать его некоторое время, но в конечном итоге это станет частью проблемы, а не решением.
Примечания:
- Это не является оскорблением сообщества Flask. Это проблема с открытым исходным кодом в целом, особенно с микро-веб-фреймворками, где вам часто приходится объединять несколько проектов, поддерживаемых разными разработчиками в разных циклах выпуска, с разным уровнем качества документации. Обратитесь к сообществу JavaScript, если хотите увидеть это в полной мере.
- Сообщество Django никоим образом не застраховано от этого. Это просто меньшая проблема, поскольку оно "из коробки" обрабатывает практически все, что требуется для создания и защиты стандартного веб-приложения.
Подробнее об этом обзоре читайте в разделе "Open source momentum" из Django vs Flask: взгляд практиков:
Из-за отсутствия единого фронта не удается реализовать возможность синергетических усилий, которые объединили бы все расширения, создавая пористые расширения. Это оставляет разработчикам возможность заполнить пробелы для создания всеобъемлющей функциональности, которая уже работала бы, если бы они просто выбрали другой инструмент для этой работы.
Прием на работу
Несмотря на популярность как Python, так и Django, нанять разработчиков на Django сложно. Их трудно найти и удержать, поскольку они пользуются большим спросом, и, как правило, они работают на руководящих должностях, поэтому могут быть довольно дорогими. Кроме того, не так много новых, начинающих веб-разработчиков изучают Django, поскольку индустрия больше ориентирована на небольшие фреймворки, а сам фреймворк сложен в освоении.
- Отраслевые тенденции: Из-за роста числа микросервисов начинающие веб-разработчики, как правило, осваивают более компактные и легкие фреймворки. Кроме того, все больше и больше веб-разработчиков выбирают JavaScript, а не Python или Ruby, в качестве своего первого языка из-за популярности клиентских JavaScript-фреймворков - Angular, React и Vue.
- Сложный в освоении: На удивление, не хватает руководств по Django, удобных для начинающих. Даже документация по Django, которая невероятно обширна, и печально известное руководство по опросам не предназначены для начинающих.
Может быть сложно нанять Flask для двоих, но, как правило, это проще, чем Django, поскольку это легкий фреймворк с меньшим количеством уровней абстракции. Сильный разработчик с опытом работы в аналогичном фреймворке на другом языке, таком как Express.js или Sinatra, может довольно быстро освоиться с приложением Flask. Нанимая таких разработчиков, сосредоточьте свой поиск на тех, кто понимает шаблоны проектирования и фундаментальные принципы программного обеспечения, а не на языках или фреймворках, которые они знают.
Варианты использования
При выборе фреймворка обязательно учитывайте индивидуальные потребности вашего проекта. Поскольку Django предоставляет множество наворотов, вам следует воспользоваться ими. Если у вас есть серьезные разногласия с тем, как Django обрабатывает что-то, вы можете выбрать Flask. То же самое можно сказать, если вы не собираетесь использовать структуру и инструменты, которые предоставляет Django.
Давайте рассмотрим несколько примеров.
База данных
Если ваше приложение использует SQLite, PostgreSQL, MySQL, MariaDB или Oracle, вам следует внимательно изучить Django. С другой стороны, если вы используете NoSQL или вообще не используете базу данных, то Flask - отличный выбор.
Размер проекта и ожидаемый срок его реализации
Flask лучше подходит для небольших и менее сложных проектов с четко определенными областями применения и более коротким ожидаемым сроком службы.
Поскольку Django обеспечивает согласованную структуру приложения независимо от размера проекта, почти все проекты Django имеют схожую структуру. Таким образом, Django лучше справляется с крупными проектами (с большими командами), которые имеют более длительный срок службы и потенциал для значительного роста, поскольку вам, скорее всего, придется время от времени привлекать новых разработчиков.
Тип приложения
Какое приложение вы создаете?
Django превосходен в создании полнофункциональных веб-приложений с использованием серверных шаблонов. Если вы просто разрабатываете статический веб-сайт или веб-сервис RESTful, который поддерживает работу вашего SPA-центра или мобильного приложения, Flask - отличный выбор. Django в сочетании с фреймворком Django REST также хорошо работает в последнем случае.
API-интерфейсы RESTful
Разработка RESTful API?
Django REST Framework (DRF), один из самых популярных сторонних пакетов Django, представляет собой фреймворк, используемый для представления моделей Django через интерфейс RESTful. В нем есть все, что вам нужно (просмотры, сериализаторы, проверка подлинности, авторизация) и многое другое (доступный для просмотра API, управление версиями, кэширование) для быстрого и простого создания API. Тем не менее, опять же, имейте в виду, что, как и Django ORM, он предназначен для работы с реляционной базой данных.
У Flask также есть ряд замечательных расширений:
Use | Extensions |
---|---|
Views | Flask-RESTful, Flask-Classful, Flask-RESTX |
Serialization | Flask-Marshmallow |
Auth | Flask-JWT, Flask-JWT-Extended |
Обязательно ознакомьтесь также с Connexion, который объединяет функции просмотра, сериализации и аутентификации в одном пакете!
Ознакомьтесь с этим Ответом Stack Exchange на ряд других требований, которые вы, возможно, захотите принять во внимание при выборе платформы.
Производительность
Flask работает немного лучше, так как он меньше по размеру и имеет меньше слоев. Однако разница здесь незначительна, особенно если учитывать операции ввода-вывода.
Заключение
Итак, какой фреймворк вам следует использовать? Как всегда, это зависит от обстоятельств. Выбор в пользу одного фреймворка, языка или инструмента почти полностью зависит от контекста и конкретной проблемы.
Django является полнофункциональным, поэтому от вас или вашей команды требуется меньше решений. Вероятно, таким образом вы сможете работать быстрее. Однако, если вы не согласны с одним из вариантов, предложенных Django, или у вас есть особые требования к приложению, которые ограничивают количество функций, которыми вы можете воспользоваться, вы можете обратиться к Flask.
Всегда найдутся компромиссы.
Подумайте о таких ограничениях проекта, как время, знания и бюджет. Каковы некоторые из ключевых функций вашего приложения? В чем вы не можете пойти на компромисс? Вам нужно действовать быстро? Требуется ли вашему приложению большая гибкость? Отвечая на эти вопросы, постарайтесь отбросить свое мнение в сторону.
В конечном счете, оба фреймворка снизили барьер для создания веб-приложений, сделав их разработку намного проще и быстрее.
Я надеюсь, что это было полезно. Для получения дополнительной информации ознакомьтесь с этими двумя замечательными ресурсами:
Вернуться на верх