Здравствуйте.

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

Общепринято, что любой web-фреймворк состоит из следующих компонентов:
  • Роутинг
  • Шаблонизатор
  • Формы
  • ORM (если это не микро фреймворк)
  • Работа с протоколом HTTP на уровне запроса и ответа
  • Разнообразные утилиты


Тем, кому интересно что во всех этих вещах не так в Django, добро пожаловать под кат.



Заранее оговорюсь, что Dango мне очень нравится, если бы не следующее…

1. Роутинг



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

Примеры батареек для улучшения работы с роутингом: django-hosts, routr.

2. Шаблонизатор



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

Как это можно решить? Заменить шаблонизатор на Jijna 2 (благо с появлением CBV это очень просто).

Батарейки: django-jinja, coffin.

3. Формы



Они просто нарушают MVC. Для того чтобы определить, например, css класс для поля, нужно передать его в виджет. Не будем же мы заставлять дизайнера править код? Отсутствие FormField делает жизнь еще веселее. Доставляет clean_fieldname который не видит полей, перечисленных позже него.

Как это можно решить? Использовать те же WTForms.

4. ORM


До сих пор не могу понять, как делается left join и как мне явно указать какой join делать.
Ужасное наследование моделей. Из мелочей: отсутствие join по разным базам, невозможность создать модель без первичного ключа. Наконец то появится index_together.

Как это можно решить? Использовать ту же peewee.

5. Работа с протоколом HTTP



Отсутствие необходимых исключений (в том же WebOb любой HTTP ответ является в том числе и исключением). Неудобное обращений к заголовкам, нвозможность стандартно парсить uri, очень непонятно как получить тело запроса в первоначальном виде и т.д.

Как это можно решить? Использовать тот же WebOb.




Если все это сделать, что тогда останется от django кроме админки?
Как это можно решить? Поставить flask-peewee.

Спасибо за внимание.