Что выбрать или Django vs Flask?
Здравствуйте.
Собираюсь начать писать небольшой проект для себя, для опыта.
Все это на Python.
Познания Django — базовые, без опыта работы.
Познания Flask — чуть выше базовых, опыт написания небольшого блога с регистрацией и комментариями.
На чем лучше будет построить проект, что-бы максимально приблизить его к реальному, да и что-бы при трудоустройстве не стыдно было показать.
Нестандартные ссылки приветствуются (документацию и сам могу найти).
З.Ы. Когда делал проект на Flask использовал sqlite. Что же использовать сейчас?
Flask vs Django: какой веб-фреймворк выбрать?
Когда речь заходит о выборе веб-фреймворка на Python, то выбор чаще всего стоит между Django и Flask, ведь они пользуются наибольшей популярностью. Они позволяют быстро создавать масштабируемые приложения: от простых веб-сайтов до систем со сложной архитектурой. Но каждая из этих сред разработки имеет свои уникальные особенности, на которые стоит обратить внимание, прежде чем выбирать одну из них для создания своего приложения.
Django — это полноценная платформа, включающая в себя огромное количество функций. Поэтому она долгое время была абсолютным лидером среди остальных фреймворков Python. Но индустрия веб-разработки все больше склоняется в сторону микросервисной архитектуры, и поэтому за последние годы сильно вырос спрос на легковесные фреймворки. Самым известным среди них является Flask. Он настолько быстро вырос в спросе, что он делит поровну первенство вместе со своим старшим братом.
Таким образом, оба фреймворка популярны и используются для разработки веб-приложений. Ключевое различие заключается в их подходе к разработке. Разберем детальнее, когда лучше выбрать Django или Flask для своего проекта.
Django
Это веб-фреймворк высокого уровня, который позволяет выполнять быструю разработку. Основной целью его инфраструктуры является создание сложных веб-сайтов, управляемых базами данных.
В Django разработчик может использовать наиболее популярные функции из коробки, соответственно, ему остается построить именно бизнес-логику.
Яркими примерами использования Django являются приложения Spotify, Pinterest, Instagram, Dropbox.

Преимущества Django
Вот некоторые особенности, выделяющие Django среди других Python фреймворков:
- Это универсальная структура, которую можно использовать приложений любого масштаба (социальной сети, новостного сайта, системы управления контентом и т. д.) Также он интегрируется с содержимым в любом формате, таком как HTML, XML, JSON и т. д. Он работает в паре с любым JavaScript-фреймворком.
- В нем из коробки учтены стандартные функции безопасности, например, управление учетными записями пользователей, управление транзакциями, подделка межсайтовых запросов, кликджекинг и многое другое.
- Масштабируемость. Фреймворк следует шаблонам и принципам проектирования для повторного использования и поддержки кода. Главный принцип «Не повторяйся» гарантирует отсутствие повторов. Поскольку Django — это фреймворк, основанный на компонентах, каждый уровень независим от другого, что делает приложение масштабируемым на любом уровне.
- Встроенная система интернационализации позволяет создавать многоязычные сайты без использования дополнительных плагинов.
Недостатки Django
- Это монолитная платформа. Для кого-то это будет преимуществом, но не всегда. Фреймворк имеет определенный набор файлов и предопределенных переменных. Его файловую структуру легко освоить, но он не позволяет использовать собственную.
- Не подходит для небольших проектов. Вся функциональность Django поставляется с большим количеством кода. Его обработка занимает время сервера, что создает некоторые проблемы для слабого железа.
Flask
Flask —это легкий фреймворк, обычно называемый микрофреймворком. Ключевой особенностью, выделяющей его среди конкурентов, стали его возможности кастомизации.
Flask поставляется всего с некоторыми стандартными функциями, но зато он позволяет разработчикам добавлять любое количество библиотек и плагинов для улучшения функциональности. Это могут быть расширения для проверки формы, объектно-реляционные преобразователи, открытые системы аутентификации, механизм загрузки и ряд других инструментов.
Благодаря возможности гибких настроек Flask используют в продуктах, где нужен полный контроль над всеми компонентами. Например, Airbnb, Netflix или Reddit.

Преимущества Flask
Среди Python-фреймворков Flask выделяется следующими особенностями:
- Простая для понимания разработка. Фреймворк прост для понимания, поэтому он лучше всего подходит для начинающих.
- Гибкость. В отличие от других веб-фреймворков, Flask позволяет полностью контролировать разработку. Программист сам с помощью внешних функций собирает всю структуру приложения. В фреймворке есть только несколько составляющих, которые нельзя изменить. Все остальные части открыты для изменений.
- Использование Flask позволяет проводить модульное тестирование благодаря встроенной поддержке, встроенному серверу разработки, быстрому отладчику и удобной диспетчеризации запросов.
Недостатки Flask
- Долгая первичная настройка проекта. Так как во Flask практически весь функционал устанавливается через сторонние расширения, то начальный этап разработки с этим фреймворком будет дольше по сравнению с тем же Django, где все необходимое идет из коробки.
- Использование дополнительных модулей не всегда является преимуществом. Некоторые библиотеки, интегрированные в продукт, не остаются на рынке и со временем теряют поддержку. Это означает, что их придется либо обслуживать самостоятельно, либо менять библиотеку, что увеличивает стоимость поддержки приложения.
- Также использование сторонних модулей может рассматриваться как вмешательство третьих лиц, что может стать серьезной брешью в системе безопасности. В процессе разработки программист может случайно подключить вредоносный модуль, и это может вызвать серьезные проблемы на проекте.
Сравнение Django и Flask
Обширная документация
Минимум функций
Полный контроль над процессом разработки
Ключевые отличия между Flask и Django
Если кратко, то Django — это полноценный фреймворк с множеством уже подключенных функций, а Flask оставляет все под вашим контролем. Но это не вся разница между ними. Давайте сравним эти инструменты с точки зрения их функций:
База данных
Django включает в себя простую, но мощную ORM (Object Relational Mapping), которая поддерживает ряд готовых реляционных баз данных : SQLite, PostgreSQL, MySQL, MariaDB и Oracle. ORM обеспечивает поддержку создания и управления миграциями баз данных . Также довольно легко создавать формы, представления и шаблоны на основе моделей данных, что идеально подходит для типичного веб-приложения CRUD.
Flask не делает никаких предположений о том, как хранить данные, но существует множество библиотек и расширений , которые могут помочь в этом: SQLAlchemy, Alembic, Pewee, PonyORM, PyMongo, MongoEngine.
В заключение, если вы используете реляционную базу данных, Django значительно упрощает начало работы, поскольку имеет встроенный ORM и инструмент управления миграцией. Однако, если вы используете нереляционную базу данных или хотите использовать стороннюю ORM, такую как SQLAlchemy, то фреймворк будет отчаянно сопротивляться на каждом этапе.
Flask предоставляет свободу выбора ORM (или ODM), который лучше всего работает с конкретным приложением. Однако за свободу приходится платить: кривая обучения выше и больше места для ошибок, поскольку разработчик берет на себя ответственность за управление этими элементами. Чем больше кастомизации, тем больше проблем всплывет по мере масштабирования.
Авторизация
Поскольку большинство веб-приложений требуют аутентификации и авторизации, Django предоставляет эту функциональность вместе с управлением учетными записями и поддержкой сеансов из коробки.
Flask обеспечивает поддержку сеансов на основе файлов cookie, но придется обратиться к сети расширений для управления учетными записями, аутентификации и авторизации: Flask-Login, Flask-Principal, Flask-Security.
Административная панель
Django поставляется с функциональной панелью администратора , которая представляет собой веб-приложение, предоставляющее пользовательский интерфейс для управления данными. В этой области он отлично себя проявляет и позволяет быстро выполнять операции CRUD без написания дополнительного кода.
Опять же, Flask не поставляется с чем-то подобным, но расширение Flask-Admin предлагает все те же функции. К тому же, он поддерживает ряд серверных баз данных, таких как SQLAlchemy, Peewee или MongoEngine. И его можно использовать с популярными расширениями аутентификации.
Формы
Формы — это еще одна важная часть большинства веб-приложений, которая поставляется вместе с Django. Она включает в себя обработку ввода и проверку на стороне клиента и сервера, а также обработку различных проблем безопасности, таких как подделка межсайтовых запросов (CSRF), межсайтовый скриптинг (XSS) и внедрение SQL. Их можно создавать из моделей данных (через ModelForms ) и хорошо интегрировать с панелью администратора.
Flask по умолчанию не поддерживает формы, но у него есть мощное расширение Flask-WTF интегрирует фреймворк с WTForms . Их можно использовать для автоматического создания форм на основе моделей SQLAlchemy.
Группировка компонентов
Что касается структуры проекта, то по мере масштабирования приложения обе платформы упрощают их разделение путем группировки связанных файлов, обладающих сходной функциональностью. Таким образом, можно сгруппировать вместе все функции, связанные с пользователем, которые могут включать маршруты, представления, формы, шаблоны и статические ресурсы.
Для разбиения архитектуры на части у Django есть концепция Приложений (Applications) , а у Flask есть Чертежи (Blueprints). Приложения более сложны в запуске, но с ними, как правило, легче работать, и можно повторно их использовать после настройки. В то же время чертежи Flask проще настроить и запустить.
Шаблоны и статические файлы
Механизмы шаблонов позволяют динамически выводить информацию на HTML-страницу из бэкэнда. Flask по умолчанию использует Jinja2, в то время как Django имеет собственный механизм шаблонов . Они довольно похожи с точки зрения синтаксиса и набора функций.
Оба фреймворка также поддерживают обработку статических файлов. Но в Django есть удобная команда для сбора всех статических файлов и их размещения для развертывания в рабочей среде.
Тестирование
Обе платформы имеют встроенную поддержку тестирования. Для модульного тестирования они оба используют среду Python . Также у каждого есть тестовый клиент, которому можно отправлять запросы, а затем проверять ответы.
Безопасность
Как уже упоминалось, Django имеет встроенную защиту от ряда распространенных векторов атак, таких как CSRF, XSS и SQL-инъекция. Эти меры безопасности помогают защитить код от уязвимостей. Команда разработчиков также активно выявляет и быстро устраняет известные уязвимости в системе безопасности.
Flask, с другой стороны, имеет гораздо меньшую кодовую базу, поэтому у неё меньше возможностей для атаки. Однако разработчикам придется устранять уязвимости в коде приложения, созданном вручную.
Поскольку Flask гораздо больше зависит от сторонних расширений, приложения будут менее безопасны. К тому же, их поддержка в актуальном состоянии — это самая важная и сложная вещь, поскольку у каждого расширения есть собственная команда разработчиков, документация и циклы выпуска. В некоторых случаях, конкретное расширение может поддерживать только один или два разработчика. По частоте обновлений можно увидеть, сколько времени обычно требуется разработчикам расширения, чтобы реагировать на критические проблемы.
Гибкость
Flask по своему дизайну гораздо более гибкий, чем Django, и его можно расширять . Но из-за этого он обычно требует больше времени для настройку, поскольку придется добавлять соответствующие расширения в зависимости от потребностей бизнеса, например, ORM, разрешения, аутентификацию и т. д. Эти первоначальные затраты обеспечивают большую гибкость в будущем для приложений, которые не соответствуют стандартной модели фреймворка.
Однако гибкость дает разработчикам больше свободы и контроля, но это может замедлить разработку, особенно для больших команд и сложной архитектуры.
Легкость изучения
Flask легче и намного понятнее, чем Django. Новичкам в программировании рекомендуют начинать именно с него. Но для бизнеса это может стать минусом из-за вероятности получить неопытного разработчика.
Сообщество
Оба фреймворка славятся своей хорошей репутацией и сильным сообществом. Но если смотреть статистику GitHub за 2022 год, то видно, что Django имеет больше участников, так как он старше, и имеет больше контента. Но при этом Flask используется в большем количестве проектов.
В каких проектах лучше использовать Django или Flask
Перед выбором стека обязательно стоит принять во внимание индивидуальные потребности проекта. Поскольку Django предоставляет множество встроенных функций, его есть смысл использовать только если вы будете использовать его структуру и инструменты на проекте. Иначе будет большое количество неиспользуемого и лишнего кода.
Рассмотрим несколько примеров:
База данных
Если приложение использует SQLite, PostgreSQL, MySQL, MariaDB или Oracle, то лучше присмотреться к Django. С другой стороны, если вы используете NoSQL или вообще не используете базу данных, то Flask — хороший выбор.
Размер проекта и предполагаемый срок службы
Flask лучше подходит для небольших и кратковременных проектов с четко определенными границами.
Поскольку Django обеспечивает согласованную структуру приложения независимо от объемов, то почти все проекты Django имеют одинаковую структуру. Из-за этого Django лучше справляется с более крупными проектами и большими командами, которые имеют более длительный срок службы и потенциал для значительного роста, поскольку вам, скорее всего, придется время от времени нанимать новых разработчиков.
Тип приложения
Django отлично подходит для создания полнофункциональных веб-приложений с шаблонами на стороне сервера. Если вы просто разрабатываете статический веб-сайт или небольшой веб-сервис,то лучше выбрать Flask.
RESTful API
Django REST Framework (DRF) — представляет собой полноценную библиотеку для предоставления моделей Django через интерфейс RESTful. Она поставляется со всем, что будет необходимо для быстрого и простого создания AP:I представления, сериализаторы, проверка, аутентификация, управление версиями, кэширование.
Flask также имеет ряд отличных расширений: JWT, Marshmallow, Flask-RESTful , Flask -Classful , Flask-RESTX, поэтому для него также возможны все функции для создания API.
Производительность
Считается, что Flask работает немного лучше, так как он компактнее. Однако разница здесь незначительна, особенно если принять во внимание объем разрабатываемого проекта.
Вывод
Итак, какой фреймворк использовать? Выбор между инструментами всегда и полностью полностью зависит от контекста и проблемы.
Django является полнофункциональным, поэтому начало работы с ним будет двигаться быстрее. Но если логика некоторых функций в проекте будет расходиться с общей концепцией и философией фреймворка, то придется придумывать какие-то решения, из-за которых может расти техдолг и усложняется дальнейшая поддержка.
Если приложение нуждается в каких-то индивидуальных настройках, тогда лучше использовать Flask, так как он полностью кастомизируется, и приложение собирается с помощью модулей. Это увеличивает время первичных настроек, зато предоставляет огромную гибкость.
Django vs. Flask in 2023: Which Framework to Choose
Posted by
Michael Herman Last updated January 30th, 2023
Share this tutorial
- Hacker News
According to the 2021 JetBrains Python Developers Survey, Django and Flask are by far the two most popular Python web frameworks. While Django has traditionally been the most popular Python web framework, Flask moved past Django to take the top spot a few years ago, which is no surprise considering that the web development industry has been trending toward smaller frameworks, microservices, and «serverless» platforms over the past seven or so years.
Or perhaps this has less to do with industry trends and more to do with JetBrains users?
Django and Flask have mature communities, are widely supported and popular, and offer productive approaches to application development, letting you focus your time and energy on the unique parts of your application rather than the core scaffolding. In the end, both frameworks are used to develop web applications. The key difference lies in how they achieve this goal. Think of Django as a car and Flask as a bike. Both can get you from point A to point B, but their approaches are quite different. Each has its own best use cases. The same goes for Django and Flask.
In this article, we’ll look at the best use cases for Django and Flask along with what makes them unique, from an educational and development standpoint.
Contents
Philosophy
Django and Flask are both free, open source, Python-based web frameworks designed for building web applications.
When compared to Flask, Django embraces stability as well as a «batteries included» approach where a number of batteries (e.g., tools, patterns, features, and functionality) are provided out-of-the-box. In terms of stability, Django generally has longer, more rigid release cycles. So, while Django releases come with fewer shiny new features, they tend to have stronger backwards compatibility.
Based on Werkzeug, Flask handles the core scaffolding well. Out-of-the-box, you get URL routing, request and error handling, templating, cookies, support for unit testing, a debugger, and a development server. Since most web applications need quite a bit more (like an ORM, authentication and authorization, to name a few), you get to decide how you want to build your application. Whether you leverage third-party extensions or customize the code yourself, Flask stays out of your way for this. It’s much more flexible than Django. There’s also much less surface area open to attack and less code to review if you need to crack open the hood and look at the source code.
I highly encourage you to read and review the Flask source code. Clean, clear, and concise — it’s an excellent example of well-structured Python code.
Features
Next, let’s compare Flask and Django based on the features that ship with the core frameworks.
Database
Django includes a simple yet powerful ORM (Object Relational Mapping) that supports a number of relational databases out-of-the-box: SQLite, PostgreSQL, MySQL, MariaDB, and Oracle. The ORM provides support for generating and managing database migrations. It’s also fairly easy to create forms, views, and templates based on the data models, which is perfect for your typical CRUD web application. While it does have some shortcomings, it’s good enough for the majority of web applications.
Flask makes no assumptions about how data is stored, but there are plenty of libraries and extensions available to help with that:
| 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 |
In conclusion, if you’re using a relational database, Django makes it much easier to get started since it has a built-in ORM and migration management tool. If, however, you’re using a non-relational database or would like to use a different ORM like SQLAlchemy, Django will fight you almost every step of the way. Plus, you’ll most likely not be able to take advantage of the Django admin, model forms, or DRF model serializers.
Flask stays out of your way, giving you the freedom to pick and chose the ORM (or ODM) that works best with your application. Freedom comes at a price, though: There’s a higher learning curve and more room for error since you’re managing these pieces yourself.
The more you do on your own the more mistakes you’ll make, especially as things scale.
Since most web applications require authentication (who are you?) and authorization (what are you allowed to do?), Django provides this functionality along with account management and support for sessions (via the User model) out-of-the-box. Flask provides support for cookie-based sessions, but you’ll have to turn to the extension network for account management, authentication, and authorization.
| Use | Extension |
|---|---|
| Account management, Authentication | Flask-Login |
| Authorization | Flask-Principal |
| Account management, Authentication, Authorization | Flask-Security |
Admin
Django comes with a functional admin panel, which is a web application that provides a user interface for managing data based on your models. This is another area where Django shines. It allows you to quickly perform CRUD operations against your models as you build out an application without writing any extra code. Again, Flask does not ship with anything like this, but the Flask-Admin extension offers all of the same functionality and a lot more:
Django does lots of things automatically.
Flask philosophy is slightly different — explicit is better than implicit. If something should be initialized, it should be initialized by the developer.
Flask-Admin follows this convention. It is up to you, as a developer, to tell Flask-Admin what should be displayed and how.
Sometimes this will require writing a bit of boilerplate code, but it will pay off in the future, especially if you have to implement some custom logic.
Flask-Admin supports a number of database backends, like SQLAlchemy, Peewee, MongoEngine, to name a few. You can add your own backends as well. It can also be used with (or without) the popular Flask auth extensions:
Routing and Views
Both frameworks allow you to map URLs to views and support function and class-based views.
Django
When a request matches a URL pattern, the request object, which holds the HTTP request information, is passed to a view and that view is then invoked. Anytime you need access to the request object, you must explicitly pass it around.
URLs and views are defined in separate files — urls.py and views.py, respectively.
Flask
At it its core, Flask uses Werkzeug, which provides URL routing and request/response handling.
The request object is global in Flask, so you can access it much easier (as long as you import it). URLs are generally defined along with the view (via a decorator), but they can be separated out into a centralized location similar to the Django pattern.
Did you take note of the difference in how Django and Flask both handle the request object? In general, Flask tends to be more explicit with things, but in this case it’s the opposite: Django forces you to explicitly pass around the request object while Flask’s request object is just magically available. This is one of the difficult parts with Flask, especially for those that are new to the framework coming from a similar style framework like Express.js.
Forms
Forms, another essential part of most web applications, come packaged with Django. This includes input handling and client and server-side validation along with the handling of various security concerns like cross-site request forgery (CSRF), cross-site scripting (XSS), and SQL injection. They can be created from the data models (via ModelForms) and integrate well with the admin panel.
Flask doesn’t support forms by default, but the powerful Flask-WTF extension integrates Flask with WTForms. WTForms-Alchemy can be used to automatically create forms based on SQLAlchemy models, bridging the gap between forms and the ORM much like Django’s ModelForm.
Reusable Components
With regard to project structure, as your apps get more complicated, both frameworks make it easy for you to break them up by grouping related files together that exhibit similar functionality. So, you could, for example, group all user-related functionality together, which can include the routes, views, forms, templates, and static assets.
Django has a concept of an app while Flask has blueprints.
Django apps are more complex than Flask blueprints, but they tend to be easier to work with and re-use once setup. Plus, due to the urls.py, models.py, and views.py convention — consistent project structure! — you can add new developers to a Django project fairly easily. Blueprints, meanwhile, are simpler and easier to get up and running.
Templates and Static Files
Template engines allow you to dynamically inject information onto an HTML page from the backend. Flask uses Jinja2 by default while Django has its own templating engine. They’re fairly similar in terms of syntax and feature sets. You can also use Jinja2 with Django.
Both frameworks have static file handling support as well:
Django comes with a handy management command for collecting all static files and placing them in a central location for production deployments.
Asynchronous Views
Django supports asynchronous handlers with the introduction of Django 3.1. A view can be made asynchronous by using the keyword async . The async support is available to middlewares also. If you need to make a synchronous call inside an async view, you can use the sync_to_async function/decorator. This can be used to interact with other parts of Django that don’t support async yet, like the ORM and cache layer.
Asynchronous web servers, including, but not limited to, Daphne, Hypercorn, Uvicorn, should be used with Django to leverage the full power of asynchronous views.
Flask 2.0 added built-in support for asynchronous routes/views, error handlers, before and after request functions, and teardown callbacks!
For more on asynchronous views in Django and Flask, check out the Async Views in Django and Async in Flask 2.0 articles, respectively.
Testing
Both frameworks have in-built support for testing.
For unit testing, they both leverage Python’s unittest framework. Each of them also support a test client that you can send requests to and then inspect and validate parts of the response.
In terms of extensions, if you like how the unittest framework works, check out Flask-Testing. On the other hand, the pytest-flask extension adds pytest support to Flask. For Django, check out pytest-django.
Other Features
There are several other features not already mentioned that come with Django but not 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 |
Security
As mentioned, Django has built-in protection against a number of common attack vectors like CSRF, XSS, and SQL injection. These security measures help protect against vulnerabilities in your code. The Django development team also proactively discloses and quickly fixes known security vulnerabilities. Flask, on the other hand, has a much smaller code base so there’s less surface area open to attack. However, you’ll need to address and fix security vulnerabilities in your hand-crafted app code as they surface.
At the end of the day, you’re only as secure as your weakest link. Since Flask is much more reliant on third-party extensions, applications will only be as secure as the least-secure extension. This puts more pressure on your development team to maintain security by evaluating and monitoring third-party libraries and extensions. Keeping them up-to-date is the most important (and often the hardest) thing here since each extension has its own development team, documentation, and release cycles. In some cases, there may only be one or two developers maintaining a particular extension. When evaluating one extension over another be sure to review GitHub issues to see how long it generally takes for maintainers to respond to critical issues.
This does not mean that Django is inherently more secure than Flask; it’s just easier to secure upfront and maintain during the life of your application.
Flexibility
Flask, by design, is much more flexible than Django, and it’s meant to be extended. Because of this, Flask generally takes longer to set up since you’ll have to add the appropriate extensions based on business needs — e.g., ORM, permissions, authentication, and so forth. This upfront cost results in more flexibility down the road for applications that don’t fit the standard Django model.
Be careful with this, though. Flexibility gives developers more freedom and control, but this can slow down development especially for larger teams since a lot more decisions need to made.
Developers love having the freedom to do whatever they want to solve a problem. Since Flask doesn’t provide many constraints or opinions on how an app is developed, developer’s get to introduce their own. The result is that two Flask apps that are functionally interchangeable compared side-by-side will often be structured differently. Thus, you need a more mature team that understands design patterns, scalability, and the importance of testing to handle such flexibility.
Education
Learn patterns, not languages or frameworks.
Regardless of whether your end goal is to learn Flask or Django, start with Flask. It’s a great tool for learning web development fundamentals and best practices along with the core pieces of a web framework that are common to almost all frameworks.
- Flask is lighter and much more explicit than Django. So, if you’re new to web development but not to Python, you’ll find it much easier to develop in Flask since it will feel much like you’re working with vanilla Python to define request handlers and views and what not.
- Django has a lot of overhead. From the project structure to the settings to installing a number of nuts and bolts that you don’t know anything about, you’ll get lost and end up learning more about Django itself than the actual fundamentals.
In almost all cases, it’s recommended to learn Flask before Django. The only time you should deviate from that is when you just need to get an app up quick to satisfy some external stakeholder. Just be sure to work your way back to Flask to learn the basics at some point.
Open Source
Django and Flask have strong open source communities.
GitHub stats as of January 30th, 2023:
| Metric | Django | Flask |
|---|---|---|
| First commit | 2005 | 2010 |
| Contributors | 2,337 | 690 |
| Users* | 1,138,608 | 1,290,243 |
| Watchers | 2,264 | 2,149 |
| Stars | 68,431 | 61,711 |
*number of times the dependency is used by other repositories
Stack Overflow questions as of January 30th, 2023:
-
: 303,774 : 52,633
What can we conclude here?
- Both communities are very active
- Django is older and has a lot more contributors
- Flask is used by more projects
- There’s more content out there on Django
To really compare these frameworks (or ecosystems) from an open source perspective, you’d have to account for Jinja2 and Werkzeug along with some of the core Flask libraries and extensions like SQLAlchemy / Flask-SQLAlchemy, Alembic / Flask-Alembic, and WTForms / Flask-WTF.
Since the core Flask functionality is spread out across multiple projects it’s harder for the community to create and develop the necessary synergy across projects to sustain momentum. For example, Flask doesn’t have a single, de-facto extension for creating RESTful APIs; there are (arguably) four popular extensions as of January 2023:
What’s more, in order to find these extensions you need to have some pretty solid information retrieval skills. You’ll have to filter through all the un-maintained extensions out there and articles that reference them. In fact, there are so many different extension projects for RESTful APIs that it’s often easier to just roll your own and open source it. At that point, you’ll probably maintain it for a bit but eventually it will become part of the problem rather than a solution.
- This is not a knock against the Flask community. It’s an issue in open source as a whole, especially with micro web frameworks where you often have to cobble together a number of projects maintained by different developers on different release cycles with varying levels of documentation quality. Head on over to the JavaScript community if you want to see this to the extreme.
- The Django community is not immune to this by any means. It’s just less of an issue since it handles almost everything required to build and secure a standard web app out-of-the-box.
For more on this review the «Open source momentum» section from Django vs Flask: A Practictioner’s Perspective:
By not having a united front, the opportunity for synergetic efforts that bridge across extensions fail to materialize, creating extensions that are porous. This leaves devs to fill in the blanks for all-inclusive functionality that’d already be working had they just picked a different tool for the job.
Hiring
Despite both Python and Django’s popularity, it’s hard to hire Django developers. They’re difficult to find and retain since they’re in such high demand, and they’re typically more on the senior side so they can be quite expensive. There’s also not a lot of new, aspiring web developers learning Django since the industry is focused more on smaller frameworks and the framework itself is difficult to learn.
- Industry trends: Because of the rise of microservices, aspiring web developers are typically learning the smaller, lighter weight frameworks. Plus, more and more web developers are picking JavaScript, over Python or Ruby, as their first language due to the popularity of client-side JavaScript frameworks — Angular, React, and Vue.
- Difficult to learn: There’s a surprising lack of beginner-friendly Django tutorials. Even the Django documentation, which is incredibly comprehensive, and the infamous polls tutorial are not designed for beginners.
Flask can be difficult to hire for too, but it tends to be easier than Django since it’s a light weight framework with fewer abstraction layers. A strong developer with experience in a similar framework in a different language, like Express.js or Sinatra, can get up to speed with a Flask app fairly quickly. When hiring such developers, focus your search on those that understand design patterns and fundamental software principles rather than the languages or frameworks they know.
Use Cases
Be sure to take your project’s individual needs into account when you’re deciding on a framework. Since Django provides a lot of bells and whistles, you should take advantage of them. If you have strong disagreements with how Django handles something you may want to go with Flask. The same can be said if you won’t be taking advantage of the structure and tools that Django provides.
Let’s look at some examples.
Database
If you’re application uses SQLite, PostgreSQL, MySQL, MariaDB, or Oracle, you should take a hard look at Django. On the other hand, if you’re using NoSQL or no database at all, then Flask is a solid choice.
Project Size and Anticipated Lifetime
Flask is better for smaller, less-complicated projects that have well-defined scopes and shorter anticipated lifetimes.
Since Django forces a consistent app structure regardless of the size of the project nearly all Django projects have a similar structure. Because of thus, Django better handles larger projects (with larger teams) that have longer lifetimes and potential for a lot of growth since you’ll most likely have to onboard new developers from time to time.
Application Type
What kind of application are you building?
Django excels at creating full-featured web applications with server-side templating. If you’re just developing a static web site or RESTful web service that feeds your SPA or mobile application, Flask is a solid choice. Django coupled with Django REST Framework works well in the latter case too.
RESTful APIs
Designing a RESTful API?
Django REST Framework (DRF), one of the most popular third-party Django packages, is a framework used to expose Django models through a RESTful interface. It comes with everything you need (views, serializers, validation, auth) and more (browsable API, versioning, caching) for building APIs quickly and easily. That said, again, keep in mind that like the Django ORM it’s intended to be coupled with a relational database.
Flask has a number of great extensions as well:
| Use | Extensions |
|---|---|
| Views | Flask-RESTful, Flask-Classful, Flask-RESTX |
| Serialization | Flask-Marshmallow |
| Auth | Flask-JWT, Flask-JWT-Extended |
Be sure to check out Connexion as well, which combines the view, serialization, and auth functionality into a single package!
Review this Stack Exchange answer for a number of other requirements you may want to take into account when choosing a framework.
Performance
Flask performs slightly better since it’s smaller and has fewer layers. The difference here is negligible though, especially when you take I/O into account.
Conclusion
So, which framework should you use? As always, it depends. The choice to go with one framework or language or tool over another depends almost entirely on the context and problem at hand.
Django is full-featured so it requires fewer decisions to be made by you or your team. You can probably move faster that way. However, if you disagree with one of the choices that Django makes for you or you have unique application requirements that limit the number of features you can take advantage of, you may want to look to Flask.
There’s always going to be tradeoffs and compromises.
Think about project constraints, like time, knowledge, and budget. What are some of your app’s key features? What can you not compromise on? Do you need to move quickly? Does your app require a great deal of flexibility? Try to put your opinions aside as you answer these questions.
In the end, both frameworks have lowered the barrier to entry for building web applications, making them much easier and quicker to develop.
I hope this has been helpful. For more, check out these two excellent resources:
Michael Herman

Michael is a software engineer and educator who lives and works in the Denver/Boulder area. He is the co-founder/author of Real Python. Besides development, he enjoys building financial models, tech writing, content marketing, and teaching.
Share this tutorial
Share this tutorial
- Hacker News
Building Your Own Python Web Framework
In this course, you'll learn how to develop your own Python web framework to see how all the magic works beneath the scenes in Flask, Django, and the other Python-based web frameworks.
Tutorial Topics
Table of Contents
Building Your Own Python Web Framework
In this course, you'll learn how to develop your own Python web framework to see how all the magic works beneath the scenes in Flask, Django, and the other Python-based web frameworks.
Django vs Flask: что выбрать для своего проекта?

Django – это высокоуровневый фреймворк для разработки веб-приложений с открытым исходным кодом, написанный на языке Python. Как и другие фреймворки, он предлагает веб-разработчикам набор компонентов, которые увеличивают скорость разработки и облегчают весь процесс.
Фреймворк Django используется популярными веб-приложениями и сайтами, такими как PBS, Mozilla, Nextdoor, Disqus, Instagram, The Washington Post и многими другими.
Что из себя представляет Flask?
Написанный на Python, Flask – это небольшой веб-фреймворк, который не требует использования определенных библиотек или инструментов. Хоть в нем и нет компонентов, интегрирующих сторонние библиотеки, Flask поддерживает расширения, позволяющие легко подключить недостающие функции. Например, в функционале таких расширений могут быть: открытая аутентификация, проверка формы, обработка загрузки.
Такие гиганты, как LinkedIn или Pinterest, с большим успехом используют Flask.
Flask и Django: сравнение возможностей
Теперь, когда вы знаете, что представляют собой эти два веб-фреймворка Python, пришло время более подробно рассмотреть их особенности, определяющие успех вашего проекта. Ниже мы приведем сравнение функционала Flask и Django.
Если ваше приложение использует базу данных, вам, вероятно, понадобится ORM (Object-Relational Mapping, рус. объектно-реляционное отображение). Эта технология помогает в процессе сопоставления ваших моделей со схемой базы данных.
Фреймворк Django поставляется с ORM, подходящей для большинства случаев использования. Исключение здесь составляет выполнение некоторых более сложных запросов. Однако в этом случае вы можете написать необработанный SQL-запрос (хотя это обычно не рекомендуется) или использовать SQLAlchemy с django-sabridge. Django также поддерживает миграцию моделей.
А как насчет Flask? Этот небольшой фреймворк поставляется без ORM. Если все-таки ORM вам нужна, то к вашим услугам SQLAlchemy или PonyORM — на выбор. Кроме того, может понадобиться дополнительный инструмент для обработки миграций.
Шаблоны
Движок шаблонов — это инструмент, который помогает создавать html-документы динамически.
Flask поставляется с Jinja2, вдохновением для которого послужил движок шаблонов Django. Однако по сравнению с последним Jinja2 имеет более обширный функционал, который веб-разработчик может легко использовать в проекте.
Django имеет свой собственный движок (Django Template Engine), а также допускает использование других языков шаблонов, таких как Jinja2. В одном проекте можно использовать как один, так и несколько языков.
Формы
Формы необходимы для сбора данных, введенных пользователями (например, при регистрации или входе в систему).
Django предоставляет сложные инструменты для работы с формами. Он поддерживает создание форм, проверку данных и проверку CSRF-токенов.
Flask не предлагает никаких инструментов для обработки форм. Если вы хотите использовать формы, вам нужно будет использовать внешнюю библиотеку, такую как Flask WTF.
Панель администратора
Административная панель — это удобный инструмент для управления содержимым вашей базы данных, особенно если вы планируете, что приложение будет управляться не техническими сотрудниками.
Django поставляется со встроенным административным интерфейсом. Он включает в себя аутентификацию, уровни прав доступа, проверку данных формы. Создание административной панели с помощью Django происходит легко и быстро.
Flask не предоставляет админ-панель. Если разработчик хочет ее использовать, ему придется воспользоваться преимуществами внешних библиотек, таких как Flask-Admin, или создать ее самостоятельно.
Аутентификация
Если ваше приложение включает в себя ограничение доступа к ресурсам, создание учетных записей или другие действия, в которых пользователь должен быть идентифицирован, вам потребуется система аутентификации.
Django предоставляет готовую к использованию систему аутентификации с уровнями разрешений и группами. Система легко настраивается.
Используя Flask, ваша команда разработчиков должна будет реализовать эту систему самостоятельно или использовать некоторые внешние библиотеки.
Безопасность
Безопасность — это важнейший элемент любого веб-приложения, особенно если вы создаете продукт, обрабатывающий конфиденциальные пользовательские данные.
Django по умолчанию поддерживает защиту от XSS, CSRF, SQL-инъекций, кликджекинга.
Flask, в свою очередь, поддерживает защиту от XSS в Jinja2. Но вам придется помнить о защите от других атак при выборе дополнительных инструментов.
Производительность
Flask считается более быстрым, поскольку он легче, чем Django, и имеет меньше слоев. Фактические различия в производительности не слишком заметны и не имеют большого значения в производственной среде.
Django помогает быстро выпускать конечные продукты благодаря своему подходу «батарейки — в комплекте». Это позволяет создавать полезные приложения даже без глубокого знания того, как все работает под капотом.
Но для начинающих программистов процессы Django остаются тайной и воспринимаются, как какое-то волшебство. Flask обладает меньшей «магией» и его легче понять. Это хороший вариант для быстрого создания минималистичного приложения.
Вывод
Итак, кто же победитель в битве Flask против Django? И Flask, и Django предлагают многое, в зависимости от того, к чему вы стремитесь в своем проекте. Django предоставляет множество готовых инструментов. Это ускоряет процесс создания приложений, минимизирует количество внешних зависимостей и просто удобно. Flask более минималистичен, гибок и позволяет выбирать инструменты, которые вам нравятся. Но эта свобода имеет свою цену: на реализацию вещей, которые вы получаете в Django бесплатно, во Flask вы тратите время. Больше о Django здесь.
Кроме того, Django старше, за ним стоит большое сообщество, способное помочь вам в решении каких-то проблем. В отличие от Flask, Django имеет жесткую структуру приложений, которая может играть ключевую роль в вашем проекте.
Flask – это лучший вариант для приложений с небольшим функционалом. А Django будет разумным выбором, если вы работаете над сложным приложением, ориентируетесь на конечный срок, а свобода выбора инструментов не так уж важна для вас.