Flask или Django? Выбираем Python вебфреймворк

Flask или Django

Flask или Django?

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

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

Разница между Flask и Django

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

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

  • Объект Request — Flask использует локальные потоки, а Django передает запрос там, где это нужно.
  • Формы — Django доступен со встроенными формами, которые интегрируются с ORM и админкой сайта. Flask не поддерживает формы по умолчанию, но вы можете использовать WTForms, чтобы заполнить этот пробел.
  • Базы данных — Django доступен со встроенной ORM и системой миграции, которая может управлять базами данных. Flask не может этим похвастаться, однако есть инструменты, такие как SQLAlchemy, которые предоставляют аналогичный функционал (или даже больше).
  • Аутентификация и привилегии пользователям — Django предоставляет приложение аутентификации, которое предоставляет реализацию по умолчанию для пользовательского управления и привилегий. Flask предоставляет безопасные куки в качестве инструмента вашей собственной реализации.
  • Панель администратора — Django включает в себя полностью интегрированный админ-интерфейс для управления данными приложения. Flask не имеет таких функций, но Flask-Admin — очень популярное расширение, которое можно использовать для создания аналогичного административного инструмента.

Что такое Django?

На сайте Django утверждают, что “Django упрощает создание веб-приложений, делает это быстрее, используя меньше кода”, и называют Django “веб-фреймворк для перфекционистов с дедлайнами”. Действительно, Django — это взрослый фреймворк, который (по-умолчанию) делает множество решений самостоятельно, так что у пользователя в распоряжении инструмент для создания типичных веб приложений.

Если вам подходит хотя бы большая часть этих инструментов и надстроек от Django, вы можете создать весьма сложное приложение и сделать это быстро.

Какие компании используют Django?

  • Instagram
  • Pinterest
  • Udemy
  • Coursera
  • Zapier

Что такое Flask?

На сайте Flask его описывают как “микрофреймворк для Python, основанный на Werkzeug, Jinja 2 и отличных решениях” и “веб-разработка, по капле за раз”. Еще раз, это дает вам хорошее представление о пространстве, которым Flask пытается заполнить переполненный мир веб-фреймворков Python.

В частности, Flask может вести себя как мини-фреймворк на Python, который хорошо обрабатывает ряд вещей, при этом оставляет место для решений, которые вы хотите принять при постройке собственного веб-приложения.

Какие компании используют Flask

  • Netflix
  • Lyft
  • Reddit
  • Zillow
  • MailGun

Сходства и различия между Flask и Django

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

Среда разработки веб приложений на Python

Сервер разработки

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

Утилиты командной строки

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

Результат:

Flask также предоставляет собственную встроенную утилиту командной строки, которая использует модуль click, что является признаком взрослого и солидного набора инструментов интерфейса командной строки. Также как и в Django, вы можете создать собственные пользовательские команды, а расширения Flask также могут внести свой вклад.

Тестирование

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

Так как и Flask и Django используют Python Unittest, вы можете поменять доступные по умолчанию тестовые раннеры и настроить тесты на свое усмотрение.

Обработка запросов в Flask и Django

Маршруты и Виды

Flask и Django позволяют вам обрабатывать запросы, путем определения видов как функции или класса, с последующим сопоставлением маршрутов (пути URL) с этими видами.

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

Преимущество данного метода заключается в том, что у вас в распоряжении одно место, в которым вы можете видеть, куда должен быть направлен запрос. Хотя вы можете делать то же самое в Flask, привычнее видеть маршруты, заявленные в одном и том же месте как виды либо с декоратором, либо с явной регистрацией маршрута в объекте приложения. Следующие примеры маршрутизации пути home/ продемонстрируют основные отличия:

Маршрутизации в Django

Маршрутизации в Flask

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

Например, класс FormView связывает логику HTTP GET и POST для отображения и обработки вводов для Django Form. Существует несколько таких общих представлений, которые позволяют вам работать намного быстрее с минимальным использованием кода, если то, что вы строите, соответствует форме.

Объект Request

Django и Flask содержат объект request, в котором хранятся данные о запросе, но доступы к этому объекту в наших фреймворках заметно отличаются.

В Django, объект request передается виду в качестве аргумента и должен быть передан в любой нужный момент. Большое преимущество выбора такого дизайна в том, что бизнес логика приложения отделена от контекста запроса. Когда что-нибудь нужно связать с контекстом запроса, вам нужно передать объект request, указав, где начинается и заканчивается контекст запроса.

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

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

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

Шаблонизаторы

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

Django оснащен собственным шаблонизатором с похожим синтаксисом и набором функций как у Jinja2. В целом, если вы предпочитаете использовать Jinja2, переключиться на Django будет не сложно.

Описание разницы между Jinja2 и шаблонизатором Django можно найти здесь. Впрочем, давайте взглянем на синтаксис:

Синтаксис шаблонизатора Jinja2

Синтаксис шаблонизатора Django

Статические файлы

Отслеживание статических файлов и понимание того, как ссылаться на них при помощи кода и шаблонов таким образом, чтобы поддерживать различные среды разработки может быть сложным заданием.

Чтобы решить задачу, оба фреймворка предоставляют утилиты для отсылки к статическим файлам (такие как css, js, jpg, png, и т.д.), благодаря которым, согласно с вашими настройками, url-ы, отсылающиеся к вашим статическим файлам будут правильно сгенерированы.

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

Вот пример того, насколько просто ссылаться на статические файлы внутри шаблона каждого фреймворка:

Ссылка на статические файлы в Django

Ссылка на статические файлы в Flask

Расширения для Flask и Django

Flask, по своей природе, был создан, чтобы расширяться. Как часть проекта, Flask специально избегает предлагать решения для вещей, которые, по его мнению, зависят от конкретного приложения, и позволяет использовать сторонние и пользовательские расширения, которые подключаются прямо к объекту приложения. Здесь вы можете ознакомиться с расширениями Flask.

Хотя Django принимает больше решений за вас, он не поддерживает каждый возможный вариант и имеет подключаемую структуру приложения, которая позволяет выполнять множество расширений и надстроек.

Формы в Django и Flask

Благодаря своему декларативному синтаксису, Django предоставляет простой способ определить объекты формы, который затем позволяет вам отобразить и обработать данные в единой форме. Формы отображаются при помощи встроенных шаблонов, которые могут быть переопределены под настраиваемый внешний вид.

Формы Django помогут вам обработать механизмы проверки данных и безопасности, такие как CSRF защита, без необходимости держать в памяти этот аспект. В Django есть несколько классов форм (ModelForm), которые интегрируются с Django ORM Models, для упрощения определения форм из ваших моделей данных.

Flask, с другой стороны, не предоставляет обработку форм, но для этого достаточно воспользоваться пакетом, например WTForms, который предоставляет аналогичный функционал Django в контексте работы с формами.

Работа с базами данных в Django и Flask

Реляционное сопоставление объектов (ORM) и Миграции

Django упакован ORM. Это, наверное, одно из самых спорных решений, принятых в контексте Django. Некоторые любят Django ORM за его простоту, некоторые — ненавидят за недостатки и за факт управления базой данных вместо пользователя. Впрочем, нет сомнений, что он позволяет вам приступить к работе очень быстро, не говоря уже о возможностях, которые гарантирует его простота.

ORM содержит инструмент для автоматической генерации и управлением миграциями баз данных. Используя предоставленные команды управления, вы можете значительно продвинуться, меняя определения вашей Django Model, при этом большая часть миграций баз данных управляется вами: существует ряд ситуации, в которых автоматически сгенерированные миграции могут значительно помочь.

Django ORM можно назвать самоуверенным инструментом, в котором есть определенные ограничения, но его можно настраивать, расширять и в конечном счете вы можете получить чистый SQL, если вам понадобиться обойти эти ограничения.

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

Аутентификация и привилегии пользователей в Flask и Django

Django предоставляет приложение аутентификации, которое вертикально интегрируется с остальной системой для предоставления пользовательской модели, системы допуска, и поддержки сессий. Есть ряд решений, принимаемых в данном приложении, с которыми вы можете согласиться (или не согласиться), и вы вольны менять их по своему усмотрению, или переписать полностью.

Может встретиться случай, например, переопределить модель пользователя по умолчанию и использовать ту, которая использует электронную почту в качестве имени пользователя.

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

Админ-Панель: Управления данными в Flask и Django

Django предоставляет панель администратора, которая позволяет вам быстро создать внутренний инструмент для управления данными из ваших моделей данных. Когда мы хотим получить веб приложение, которое запускается быстро, Django Admin — отличный способ получить простой интерфейс для управления данными приложения. Вы можете продвинуться очень далеко всего за несколько строк кода, и с ростом вашего приложения, вы можете настраивать админку как вам угодно.

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

Безопасность и способы предотвращения взлома

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

Django делает много чего вместо вас, обрабатывает и решает проблемы, связанные с безопасностью. В конечном счете, разработчик должен быть внимателен, изучить всю документацию и делать правильные решения.

Вывод

Хотя многие выберут между двумя фреймворками по своему вкусу, в конце концов вы достаточно быстро привыкните к разнице между ними. Выбирая между этими двумя фреймворками, обратите внимание на собственные нужды.

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

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

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