Чем Джанго лучше/хуже Фласка?

Kyle

4-й уровень

Постановка вопроса

Что лучше: ложка или вилка? Наушники или колонки? Тапочки или сапоги? Это звучат примерно так же нелепо, как и вопрос про фласк и джанго. Вместо этого лучше спросить "Чем Flask отличается от Django?" и "Когда мне использовать Flask, а когда - Django?". Надо разобраться.

Отличия Flask и Django

Основные отличия

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

  • Django - всё-в-одном фреймворк для стандартного набора задач, вроде админки, регистрации, базы данных, имейлов и т.п. Вариант, когда лень или некогда выбирать батарейки.

Архитектура

Flask

Нет жёсткой структуры. Можно поселить модели, контроллеры и инициализацию в одном файле, можно - в разных. Изначально проект состоит из пустой папки. Структура формируется по ходу разработки, у каждого получается что-то своё. Вот как получилось у Мигеля Гринберга, автора Flask Mega-Tutorial:

project\
  env\
    <virtual environment files>
  app\
    static\
    templates\
    __init__.py
    views.py
  tmp\
  run.py

Django

Состоит из проекта, который делится на приложения. Проект - корневая папка и глобальные настройки. Приложения - это функционал сайта, разбитый по разным модулям. У каждого проекта они свои. Примеры приложений: users отвечает за поведение и модели пользователей, API предоставляет методы для внешнего взаимодействия с сайтом и т.п. С непривычки такая система может показаться непонятной и сложной. Зато так выглядит 95% сайтов на джанго, что упрощает чтение чужого кода.

Новый проект создаётся при помощи команды django-admin startproject project_name. Фреймворк создаёт все необходимые файлы сам. Пример типичной джанги:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py

Расширение

Flask

Устанавливается практически пустым, но легко расширяется сторонними батарейками. Обычно для решения одной задачи есть несколько батареек: выбор зависит от размера команды разработчиков и нагрузки на приложение. Так фреймворк становится гибким, а проект на Фласке - крафтовым.

Django

Также можно установить сторонние батарейки. Однако в ней заменить что-то встроенное будет уже сложно. Поэтому иногда говорят, что в джанге всё приколочено гвоздями. Она годится для стандартного набора задач и если с реальностью это не сходится, от джанги надо уходить. Instagram начинали делать на Django, но в последствии там всё переписали и от неё мало чего осталось.

Масштабирование

Flask

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

Django

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

Работа с БД

Flask

Нет собственной ORM, поэтому обычно подключается библиотека SQLAlchemy (есть и альтернативы, но мы их опустим). Там происходит что-то страшное: для создания/изменения записи надо создать объект, добавить его в сессию и закоммитить:

bob = User(name='Bobby', age=1)
session.add(bob)
session.commit()

А вот как выглядят связи между таблицами (внешние ключи):

collection = db.relationship('Album', secondary=collection,
                             primaryjoin=(collection.c.user_id == id),
                             secondaryjoin=(collection.c.album_id == Album.id),
                             backref=db.backref('user\'s collection', lazy='dynamic'),
                             lazy='dynamic')

Чё?

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

query = session.query(User, Role)
query = query.join(UserRole, UserRole.user_id == User.id)

TL;DR Алхимия сложная, но это компенсируется гибкостью.

Django

Комплектуется встроенной Django ORM. Она проще Алхимии: всё уже настроено и работает, не нужно думать о сессии, ещё и Active Record приправлено. Короче говоря, запросы к БД выглядят как работа с объектом:

>>> User.objects.get(id=13)
<User: 'Sarah Connor'>
>>> User.objects.filter(job__contains='director').aggregate(Avg('salary'))
{'salary__avg': 534.35}

Так выглядит создание записи:

bob = User.objecsts.create(name='Bobby', age=1)

А так - внешний ключ:

user = models.ForeignKey(BlogUser)

Работать с такими запросами проще и приятнее. Проблемы с Active Record возникают, когда нужно что-то сложнее. В Django ORM можно написать хитрые джоины на чистом SQL, но это не DRY, лишает ORM смысла и вообще. А отковырять стандартную ORM ОЧЕНЬ непросто.

Так что мне выбрать?

То, что лучше подходит под нужды проекта. Вот мои рекомендации:

Выбирай Flask, если...

  • Нет опыта с другими фреймворками и не знаешь с чего начать
  • Хочешь подобрать каждый компонент будущего проекта под себя
  • Есть сложная работа с большой базой данных
  • Нужно просто вывести какой-то контент в интернет: статический сайт или скрипт, который что-то считает
  • После прочтения этой статьи всё ещё не можешь определиться

Выбирай Django, если...

  • Проект прямолинейный. Блог, магазин, новостной портал - для всего этого есть очевидный способ реализации.
  • Заранее известно, что проект будет большой
  • Разрабатывать будет большая или средняя команда, которая до этого не работала вместе
  • Лень подбирать модули
  • Любишь фильмы Тарантино

Что почитать

Flask

  • Flask book от дяди Мигеля. Можно купить или скачать Торрент эдишн. Если туго с английским - книга переводилась и издавалась в России.
  • Flask Mega Tutorial Устаревшая версия Flask Book, но местами всё ещё годная. Зато есть новое переиздание этого туториала, а на хабре есть его русский перевод.

Django