Здравствуйте.
Попытаюсь формализовать то, что меня постоянно раздражает в Django и заставляет придумывать разнообразные велосипеды и подключать кучу батареек только для того, чтобы сделать работу на данном фреймворке более удобной.
Общепринято, что любой web-фреймворк состоит из следующих компонентов:
Тем, кому интересно что во всех этих вещах не так в Django, добро пожаловать под кат.
Заранее оговорюсь, что Dango мне очень нравится, если бы не следующее…
Представляет из себя стрельбу из пушки по воробьям в виде регулярных выражений. Понятно что с помощью них можно решать ряд нетривиальных задач, но абсолютно нельзя решить то, что дествительно требуется в роутинге. Это такие вещи как автоматическое извлечение данных (например инстанса модели по ее идентификатору), действительно точная валидация данных (а не только знание того, что в параметре будут только цифры).
Примеры батареек для улучшения работы с роутингом: django-hosts, routr.
Шаблонизатор отличается такой килл фичей котрая постоянно раздражает, это написание шаблонных тегов на каждый чих. А также отсутствие обычных выражений, отсутствие обращения к словарю по ключу находящемуся в переменной, отсутствие вызова функции с параметром (без параметра можно), отсутсвие макросов, невозможность определить переменную, только один параметр в фильтре и т.д.
Хорошо хоть недавно появилась конструкция elif.
Как это можно решить? Заменить шаблонизатор на Jijna 2 (благо с появлением CBV это очень просто).
Батарейки: django-jinja, coffin.
Они просто нарушают MVC. Для того чтобы определить, например, css класс для поля, нужно передать его в виджет. Не будем же мы заставлять дизайнера править код? Отсутствие FormField делает жизнь еще веселее. Доставляет clean_fieldname который не видит полей, перечисленных позже него.
Как это можно решить? Использовать те же WTForms.
До сих пор не могу понять, как делается left join и как мне явно указать какой join делать.
Ужасное наследование моделей. Из мелочей: отсутствие join по разным базам, невозможность создать модель без первичного ключа. Наконец то появится index_together.
Как это можно решить? Использовать ту же peewee.
Отсутствие необходимых исключений (в том же WebOb любой HTTP ответ является в том числе и исключением). Неудобное обращений к заголовкам, нвозможность стандартно парсить uri, очень непонятно как получить тело запроса в первоначальном виде и т.д.
Как это можно решить? Использовать тот же WebOb.
Если все это сделать, что тогда останется от django кроме админки?
Как это можно решить? Поставить flask-peewee.
Спасибо за внимание.
Попытаюсь формализовать то, что меня постоянно раздражает в 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.
Спасибо за внимание.