Чем Джанго лучше/хуже Фласка?
Kyle
Постановка вопроса
Что лучше: ложка или вилка? Наушники или колонки? Тапочки или сапоги? Это звучат примерно так же нелепо, как и вопрос про фласк и джанго. Вместо этого лучше спросить “Чем 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
- Официальная документация Джанги - эталонный пример написания документации. Написана человеческим языком и содержит в себе ответ практически на любой вопрос, который может возникнуть.
- Туториал из документации. Можно начать именно с него.
- Джанго Гёлз. Альтернатива официальному туториалу. Есть русский перевод
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.