Как стать автором
Обновить

Комментарии 41

Хм… проверил себя по чек-листу в начале статьи — и понял, что выбираю Rails по совокупности всех пунктов списка (ну может, за исключением машинного обучения). И так и не понял — чем хорошо Django?
Я тоже, пока читал, сравнивал с рельсами, но в рельсах нет некоторых функций, например встроенной админки, шаблонизатора итд.
ActiveAdmin. Позволяет делать админку практически только настройками. То, что формально он не пакете Rails, вряд ли является ключевым преимуществом Django над Rails. Да и в принципе ниже написали, что и Lavarel все умеет.

Касательно темы статьи — просто на мой взгляд, в контексте «быстрых проектов» вообще говорить о преимуществах фреймворков бессмыслено. Это скорее важнее клиенту с точки зрения стоимости владения и дальнейшего сопровождения. А так… Django, Rails, Elexir, Yii, Lavarel — пусть каждый делает на чем хочет, и не уходит обиженный :)
JBuilder удобен, да, особенно, когда API разрабатываешь.
А про erb не подумал что-то, действительно. Давно вьюхи на рельсах не делал :)

Шаблонизатор Django стоит отнести к недостаткам фреймворках. Там с производительностью полное фиаско. В итоге придется либо полностью кэшировать страницы, либо переписывать все на jinja2. https://tomforb.es/just-how-slow-are-django-templates/

Mar 13, 2013

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

Посмотрите на дату той публикации
С того времени темплейты переписали

Но даже в те времена, мало кому требовалось <1мс ускорение на рендере темплейтов

Что-то я смоневаюсь в необходимости шаблонизатора в современном SPA мире. Во всяком случае давненько я ужене писал на Django html, только API.

Лично я принципиально пишу сайты, способные работать при отключенном js, например.

НЛО прилетело и опубликовало эту надпись здесь
Видимо, это статья из параллельного мира без ruby. Он вообще даже не упоминается.
Отличный фреймворк для веб-разработки. Но для меня вопрос из заголовка статьи так и остался не раскрытым. Всё что написано в главе "… когда использовать Django", с тем же успехом можно написать и про Laravel (PHP), к примеру.
Полностью согласен. Поддался хайпу вокруг Python, написал пару проектов на Django и Flask. Flask с подключением SqlAlchemy, Click даже поудобней Django. Последний проект начал на Django, плюнул и переписал на Laravel. Otwell, гад, столько сахара добавил, что Laravel подкупает скоростью и удобством разработки :). Ну повторите команду php artisan migrate:fresh --seed на другом фреймворке. Опять же фронт с webpack на выбор. Тот же rails добавил поддержку webpack, но всё равно без бубна не заведешь. Буквально вчера проект на rails 6 rc1 делал. Надеюсь, Django 4 будет использовать новые технологии из коробки.

Насчет валидации в Laravel: свои Requests более гибче, чем сериалайзеры в DRF: напишите сериалайзер для восстановления записи из soft delete если есть уникальные поля.

И еще момент: пишем, например, в проекте API для мобильного клиента. В Laravel включили Passport, аутентификация с JWT готова. И вот момент:
$users = User::orderBy('name')->get();
return response($users);

Всё! Возвращается нормальный JSON. В Django и Flask, к сожалению, так не прокатит. В Django будь добр напиши сериалайзер. В Flask подключи, например, пакет Marshmalow и напиши схему.

Django админка хороша, согласен. Описал в [Model]Admin поведение модели в админке и всё, грубо говоря. А для Laravel сделали Nova. Не менее удобная и более функциональная.

Самому не очень нравится синтаксис PHP со стрелками и точкой для конкатенации (после лаконичности Ruby). Но именно для веб приложений PHP на данный момент самый подходящий язык, ибо изначально создавался именно для обработки веб-запросов.

Извините, написал сумбурно. Материала хватит на статью о сравнении Laravel, Django, Rails :).
напишите сериалайзер для восстановления записи из soft delete если есть уникальные поля.
Не думаю что сериализаторы должны заниматься чем-то кроме сериализации и валидации данных, соответственно логика восстановления из soft delete просто не их зона ответственности. Я предложил бы реализовать эту логику в кастомном менеджере модели.

$users = User::orderBy('name')->get();
return response($users);

На мой взгляд лучше иметь четкую схему ответа на запрос, чтобы пользоваться всеми преимуществами swagger/openapi и предоставлять контракт для клиентских приложений, что как раз подходит под описанный вами кейс API для мобильного приложения. Еще замечу, что этот пример не предполагает разных представлений модели User для разных View. Соответственно чтобы получить такую возможность все равно придется что-то дописывать. При желании в Django можно написать похожий код (для соответствия вашему примеру все же придется написать обертку в несколько строк над встроенной возможностью сериализации моделей)

P.S. С PHP и RoR не знаком
Не думаю что сериализаторы должны заниматься чем-то кроме сериализации и валидации данных,


Так и я про валидацию. В Laravel пишем Request, где проверяем, нет ли текущих (не помеченных на удаление) записей с такими же значениями полей, какие передали в Request. Если есть, возвращаем сообщение об ошибке. Например,
class UserController extends Controller {
...
public function restore(UserRequest $request)
{
    // валидация происходит до выполнения действия. 
}
...
}


Вполне возможно, что в Django такая проверка делается не в сериализаторе, а в менеджере модели.
Мы с вами немножко о разной валидации говорим. Я считаю, что сериализатор должен проверять только корректность формата запроса, но не его логическую правильность по отношению к текущему состоянию БД. DRF позволит написать любую логику касающуюся моделей в сериализаторе (например ваша проверка могла бы быть в методе FooSerializer.validate()) и я периодически вижу, что люди пишут подобный код, но я бы не сказал что это что-то хорошее. На мой взгляд задача сериализатора проверить, что в запросе есть список идентификаторов (или любой другой набор полей) записей которые пользователь хочет восстановить. А уже менеджер модели занимался бы всем, что касается БД в процессе восстановления.
Также всегда в ситуации, когда мы что-то проверяем по БД, а потом на основе этого что-то изменяем появляется вероятность, что между этими двумя событиями результат проверки может измениться, в данном случае проблему можно решить используя SELECT FOR UPDATE. В случае проверки в сериализаторе, а выполнения действия восстановления где-то еще мы размазываем знание об обработке этого запроса по разным частям кода (не говоря о том, что транзакцию придется начать в сериализаторе а закрыть где-то еще), что на мой взгляд не есть хорошо.
Ни то, чтобы я с вами был сильно несогласен, но с примерами нужно быть аккуратнее. Например здесь:
$users = User::orderBy('name')->get();
return response($users);
будь я настроен менее критически, я бы решил что лара сама разбирается, когда отдавать вью с формой, а когда json. Обращение к документации снимает этот мистический момент.
Здесь правда возникает желание вступится за flask. Отдавать json подобным образом умеет и он. Потребность в дополнительной прослойке обусловлена не умением/неумением отдавать json, а потребностью отдавать только те поля, которые нужно, скрывая, например, поля с информацией о правах или связанные с аудитом. Flask изначально позиционировался как микрофреймворк, и логично, что этот функционал оформлен в виде батарейки.
будь я настроен менее критически, я бы решил что лара сама разбирается, когда отдавать вью с формой, а когда json.

Нет, конечно :). Я пример как раз для JSON и написал. Если бы я хотел вернуть вью, а бы написал:
$users = User::orderBy('name')->get();
return view('users.index', compact('users'));
Django отличный инструмент, единственная проблема с которой я столкнулся это то, что переход на новые версии требует переделывать мой код. У меня один проект на django-1.6 работает по моему года 4+. Но я не могу его перевести на django 2 поскольку объём кода который нужно править пугает.
Поэтому для новых проектов использую flask, в котором за счёт того что нужные «батарейки» подбираешь сам эта проблема не так сильно проявляется.

Ух, я недавно портировал большой серьезный проект с Django 1.7 на Django 2.2. Соответственно, в процессе также с Python 2 на Python 3, и с django-haystack (никогда не используйте — кажется, что удобно, но на самом деле мертвый и очень корявый инструмент!) на голые запросы к ElasticSearch (elasticsearch-dsl).


Работа заняла около 6 месяцев, работал в основном один. Изначально кодовая база была разработана австралийской компанией. После этого проекта, мое мнение о качестве австралийских программистов упало ниже нуля. Это заслуживает отдельной статьи, а статьи я писать не имею права на этом сайте из-за кармы. Хотя понимаю, что это отдельно взятый случай, но все же там было такое, что волосы много раз на голове шевелились. И git blame показывает, что это не индусы, не китайцы, не вьетнамцы — чистокровные австралийцы, получившие образование в Австралии, многих я потом нашел на LinkedIn, чтобы в этом убедиться.


После миграции размер кода уменьшился приблизительно на 40%, но это потому что австралийцы очень любили методологию copy-paste.


Самое сложное было не миграция c py2 на py3, и даже не миграция между версиями Django — все это заняло процентов 20-30% времени. Сложнее всего было переписать весь адский код django-haystack на elasticsearch-dsl. Ну и поскольку переход длился долго, то неизбежно пришлось во время перехода еще и добавлять множество новой функциональности, так что отделить чистое время портирования, конечно, уже невозможно.


Тут пишут в комментариях критику Django, что в нем, дескать, то же самое, что есть и в других фреймворках. Не могу ответить из-за кармы всем. Но я уже очень давно пишу на Django, и при этом периодически поглядывал по сторонам.


Так вот, все то, что есть в других фреймворках, оно там появилось после того, как было реализовано в Django. А какие-то вещи до сих пор не реализованы.


Теперь то конечно удобно говорить: «Да это и в моем фреймворке есть». А вот было оно там 3 года назад? 5 лет, 10 лет назад? То-то и оно.

Навскидку, если мне память не изменяет, отладочная панель была портирована в django из Symfony. Ну и в целом, symfony и django вышли в свет в одном 2005 году, а symfony не первый php-фреймворк

Ruby on Rails — December 13, 2005
Symfony — October 18, 2005
Django — July 21, 2005

Плодотворный был год :).

Так не важно же, как оно было 10 лет назад, пишем код-то сейчас, на том, что есть сегодня (и возможно будет завтра). И древность библиотеки — не показатель качества.

Одновременно отвечу вам и VolCh:
Django — также совсем не первый веб-фреймворк на Python. Еще до Django писались вещи, которые на десятилетия опередили все остальное, но по какой-то причине не завоевали мир (Zope и Plone, например).


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


И вот тут надо бы иметь какое-то полноценное сравнение, но честно говоря, сомневаюсь что хоть что-либо сравнится с Django по количеству батареек и скорости разработки (и отладки). Буквально для любой мыслимой задачи в Django уже есть либо встроенная функциональность, либо 1-5 решений сторонних разработчиков, которые включаются простым выполнением pip install module. Причем это очень часто качественный код, к которому прилагается настолько же качественная документация.


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

Не заткнет. Ни PHP фреймворки (тот же Yii 2), ни Ruby on Rails.
Django не хуже, но и ничего экстраординарного он не предлагает: у всех есть из коробки ORM, миграции, админки, шаблонизаторы, формы, документация и сотни расширений.
Насколько я помню, под Django довольно сложно писать основной код приложения, минимально привязіваясь к Django, писать в так назіваемом framework agnostic стиле. Прежде всего речь о бизнес-логике, о независимости бизнес-модели от фреймворка вообще и от его ORM в частности. Грубо говоря, чтобы такие сущности как User, Company, Account, Order, Contract и т. п. не были наследниками каких-то классов фреймворка, были обычными python классами, равно и как классы типа User(Repository|Store). Чтобы при необходимости, например, не представляло большого труда перейти с Django+Postgres на Tornado+Mongo
Это всё бичь паттерна Active record. В Rails то же самое. Да все популярный фреймворки придерживаются этого паттерна. Из известных мне, только в Hanami другой подход (отдельно entity и repository).
Ну в Python есть (и можно прикрутить к Django) SqlAlchemy или как-то так, который DataMapper реалиизовівает, но там оно тоже через базовые классы, насколько я знаю.

И беда обычно не столько в самом AR паттерне, сколько в том, что фреймворки, с одной стороны, сильно завязываются на конкретную реализацию AR, а, c другой, сама реализация AR завязывается на «родной» фреймворк, беря на себя какие-то дополнительніе ответственности кроме и так имеющихся двух в AR, например валидацию (не путать с соблюдением бизнес-инвариантов) или сериализацию.

Flask довольно хорош, тоже куча либ с качественной документацией:



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

Вам требуется разработать веб-приложение или серверную часть API.

Очевидно, возможно не только на Django


Требуется быстро работать, быстро развертывать и вносить изменения в проект по ходу работы.

Не скажу за других, но лично мне Django в этом лишь мешает


По умолчанию приложение должно быть защищено от наиболее распространенных уязвимостей и атак, в частности: CSRF, SQL-инъекции, XSS, кликджекинг, etc.

Есть в любом другом фреймворке/шаблонизаторе/ORM, Django здесь ничем не выделяется


В любой момент в приложении может потребоваться масштабирование: как наращивание, так и сокращение.

Django никак не способствует этому сам по себе


В перспективе вы планируете интегрировать новейшие технологии

Django сам по себе весьма устаревший


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

Вот с этим действительно не поспорить


Требуется, чтобы и веб-приложение, и серверная часть API находились в одной и той же базе кода, согласовываясь с «единым источником истины» (принцип DRY)

Непонятно, при чём тут Django


Вы не хотите работать непосредственно с запросами к базе данных, и вам нужна поддержка ORM.

Берём любую ORM, а Django тут зачем?


Вы собираетесь пользоваться свободным ПО.

Все другие популярные фреймворки тоже в целом свободное ПО


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

И с этим тоже не поспорить




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

Вот не надо мне тут Flask обижать, я переводил один немаленький и «сложный» Django-сайт на Flask и полностью доволен, всё «сложное» там отлично делается


В Django, возвращаясь к вышеприведенному коду, если вам когда-нибудь придется заменить max_length поля на что-нибудь другое – просто сделайте это здесь.

И потеряйте логины старых пользователей, потому что max_length был уменьшен, и в базе после миграции всё обрезалось. Модели НЕЛЬЗЯ использовать для валидации (и вообще они весьма негибкие в этом плане) — для этого есть формы. (Но формы мне тоже не нравятся, поэтому я вкрутил себе сторонее решение Cerberus)

Мне лично больше нравится Express.JS в связке с Typescript-ом и Gulp-ом, написал одну команду и все само скомпилировалось и запустилось. Достаточно лишь настроить и все. Да и на JavaScript-е есть много прекрасных вещей таких, например как Pug и Less.
Но все-же огромный минус, это 40-50 мегабайтная node_modules…
Вроде только самое нужное, а там 20.000 файлов, сотни папок и очень, очень, много библиотек. Но сама экосистема очень хорошая выходит, пару конфигов в корне, код в «scr», все (Less, клиентский JS код и пр.) компилируется в «dist». И это все одной командой!
В Django все явно не для маленьких проектов, что думаю не особо хорошо. Ведь все-же Django неплохой, много всего из коробки, но мне лично сложно понять, что там к чему.
Хотя я не отрицаю большее удобство и/или возможности других экосистем, фреймворков.
P.S. Да, хоть и статья про Python фреймворки, но упоминание Express.JS было, думаю хоть чуток все-же в тему.
Но все-же огромный минус, это 40-50 мегабайтная node_modules…

Так-то среднестатистический virtualenv в питоне с лёгкостью переваливает за сотню мегабайт :)

Но согласитесь, что сравнивать ExpressJS и Django не совсем корректно? Express это фреймворк который относительно быстро поможет сделать бекенд, у него нет готовой админки как у Django, нет встроенной работы с пользователями, аутентификации и т.д, я считаю что корректно сравнить Keystone c Django, но не Express, Express больше сравним с Flask.
Тут я полностью согласен, но все-же Django реально большой и многие вещи часто просто не нужны, хотя может я плохо понимаю его структуру.
Мне особенно нравится, что Django не идет на послабления по поводу безопасности, чтобы ускорить темп разработки. Функции безопасности активируются по умолчанию, поэтому совершенно не важно, ленивы вы или нет.


Что это за вода? Что это за 'функции безопасности', которые автоматически активируются?
csrf_token — как вариант)

Security by default видимо имеется в виду.

Не планирует ли издательство «Питер» выпустить книги по Python веб фреймворкам?

Давно django не смотрел (1.4 кажется поставил на одном проекте внутреннем). Как там сейчас с возможностью безболезненно следовать принципам SOLID, техническим принципам DDD и т. п.?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий