Неделя с Flask
Содержание:
Стал использовать Flask для небольших проектов. Django неимоверно разрослась, да и просто замылила глаз. В процессе работы родилось несколько полезных приложений.
Flask-Foundation
Я уже писал про open-source проекты на Flask с хорошим исходным кодом. Но как показывает практика, для быстрого старта их недостаточно.
Я собрал свою сборку: http://github.com/klen/Flask-Foundation базового проекта на Flask, содержащую следующие вещи:
- Flask-Admin — администрирование;
- Flask-Script — автоматизация;
- Flask-Cache — кеширование;
- Flask-Debugtoolbar — отладка;
- Flask-Babel — локализация;
- Flask-WTF — поддержка WTForms;
- Flask-Bootstrap — стилизация;
- Flask-Mail — почта;
- Flask-SQLAlchemy — ORM, базы данных;
- Flask-Testing — тестирование;
- Alembic — миграции бд;
Проект содержит богатый функционал и может послужить хорошим примером для быстрого старта.
Flask-Mixer
Фабрика генерации объектов из SQLAlchemy моделей. Создавалась мной в целях тестирования, но может использоваться и в других случаях (пакетная генерация данных).
Адрес на Github: http://github.com/klen/Flask-Mixer
Примеры работы:
# Простая генерация модели
user1 = mixer.blend(User)
assert user1.id and user1.username and user1.created_at
assert user1.score == 50
assert user.profile.user == user
# Модель может быть задана строкой
role1 = mixer.blend('app.models.Role')
assert role1.user
assert role1.user_id == role1.user.id
# Генерация объекта с предопределенными значениями
user2 = mixer.blend(User, username='test')
assert user2.username == 'test'
# Это могут быть значения для референс-объектов
role1 = mixer.blend(Role, user__username='test2')
assert role2.user.username == 'test2'
# Значение может быть функцией
user = mixer.blend(User, username=lambda:'callable_value')
assert user.username == 'callable_value'
# Принудительная установка случайного значения для поля с default value
user = mixer.blend(User, score=mixer.random)
assert user.score != 50
# Установка случайного значения из базы данных
profiles = Profile.query.all()
user = mixer.blend(User, profile=mixer.random)
assert user.profile in profiles
Flask-Collect
Нехватку такого приложения я почувствовал при первом же деплое Flask-проекта. Как известно раздавать статичные файлы (css, js и тп) питоном в нашем бизнесе не комильфо. Обычно проксирующий WSGI веб-сервер отдает их из определенной папки напрямую. Для сборки таких файлов из приложений проекта в Django существует встроенное приложение.
Во Flask ничего подобного не нашлось. Есть инструкции в документации где рекомендовано отдавать статичные файлы веб-сервером, но нет ни слова о том как их собирать. Не найдя ничего на Pypi я написал свое.
Использование:
В коде:
app = Flask(__name__)
collect = Collect(app)
collect.collect(verbose=True)
или из консоли при использовании Flask-Script:
$ ./manage.py collect
Адрес на Github: http://github.com/klen/Flask-Collect
Заключение
В целом Flask мне нравится. Код чище, его меньше, работает быстрее. SQLAlchemy на голову уделывает на текущий момент Django ORM.
Но порог вхождения гораздо выше, как ни странно, множество задач уже решенных сообществом Django тут приходится решать заново.