Pull to refresh

Ещё 10 батареек для джанго

Reading time 5 min
Views 27K

Продолжаем делиться своим опытом использования полезных батареек для Django.
Первая часть
Ещё рекомендуем «Сумбурные заметки про python и django» и «Django проект PR Hero: что внутри и полученный опыт».

Для Django написано огромное количество пакетов. Из них мы выбрали 10, которые использовали сами в своих последних проектах и которыми остались довольны. Все они есть на PyPI. Они продокументированы и покрыты тестами, где-то больше, где-то меньше. Исключение составляет django-sphinx, о котором отдельно.



django-hvad


Интересная реализация хранения мультиязычных полей в моделях. Для каждой переводимой модели создаётся дополнительная таблица, в которой хранятся исключительно переводные атрибуты.

Пример описания модели:

class DjangoModel(TranslatableModel):
    name = models.CharField(max_length=255, unique=True)
    author = models.CharField(max_length=255)

    translations = TranslatedFields(
        description = models.TextField(),
        description_author = models.CharField(max_length=255),
    )

    def __unicode__(self):
        return self.name


Пример запроса:

DjangoModel.objects.language('en').filter(description_author='Jonas Obrist')


Приложение одно из лучших в своей категории, хоть и альфа. Местами сыровато, что открыто признаёт сам автор. Оно старается минимизировать количество запросов к БД, дружественна к south-миграциям.
Кроме того, django-hvad умеет рисовать симпатичную админку для переводов полей:


Гитхаб
Документация

django-whatever (django-any)


Модуль позволяет отказаться от создания громоздких фикстур для тестов, заменив их простым созданием объектов моделей на лету, заполняя поля случайными данными. Благодаря этому тесты становятся более читабельными и поддерживаемыми.

Вот пример, в котором мы создаём два экземпляра моделей, но указываем при создании лишь те значения полей, которые важны для теста (остальное сделает django-any):

from django_any import any_model

class TestMyShop(TestCase):
    def test_order_updates_user_account(self):
        account = any_model(Account, amount=25, user__is_active=True)
        order = any_model(Order, user=account.user, amount=10)
        order.proceed()

        account = Account.objects.get(pk=account.pk)
        self.assertEquals(15, account.amount)


django-any написал хабраюзер kmmbvnr, а django-whatever это дружественный форк нашего авторства, в котором мы добавили несколько фич и поправили несколько багов.

Github
Доки

django-jenkins


Удобная интеграция Django и Jenkins для упрощения решения задач continious integration от kmmbvnr. Всё очень просто: настраиваешь и пользуешься, никаких нареканий нет.

Хорошие статьи про тестирование в Django и непосредственно про интеграцию с django-jenkins:

Гитхаб
Видео-туториал от автора: “Как начать тестировать и получать от этого удовольствие”

django-guardian


Приложение реализует недостающую из коробки фичу прав на объект, а не на всю модель (object-level permissions). Начиная с Django 1.2 бэкенд аутентификации поддерживает проверку прав на объект, но это не реализовано в самом Django. django-guardian успешно заполняет этот пробел.

Единственным обнаруженным недостатком является, пожалуй, то, что наличие глобальных прав на модель не даёт прав на конкретный объект и требует отдельной проверки.

Гитхаб
Доки

django-email-confirmation


Среди множества других аналогичных батареек, django-email-confirmation не берёт на себя всё и сразу, но то, что берёт — делает хорошо. Позволяет пользователю регистрировать на себя несколько email-адресов, из них выделить основной, подтверждать адреса по почте и управлять всем этим нехитрым процессом. Можно определить собственные шаблоны для писем, можно подружить метод отправки письма с Celery, всё как положено. Является частью проекта Pinax.

Гитхаб

django-compressor / webassets


Два самых интересных, на наш взгляд, приложения для склейки и минификации CSS/JS. В отличие от упоминавшегося в прошлом посте django-compress, не требуют конфига и могут работать с помощью темплейт-тегов, что довольно удобно для верстальщиков. webassets, что примечательно, работает не только с Django (flask-assets). Оба модуля поддерживают Jinja через свои расширения. Любители SAS, LESS, CoffeeScript не уйдут обиженными, препроцессоры тоже поддерживаются.

Мы используем django-compressor и предостерегаем вас от поспешных обновлений на свежие версии приложения на боевых серверах: модуль активно разрабатывается и периодически всплывают неожиданные регрессии (несмотря на тесты). В остальном очень хороший пакет от одного из django core devs.

django-compressor гитхаб
django-compressor доки

webassets гитхаб
webassets доки

django-taggit


Простая батарейка, как по структуре, так и по возможностям. Как ясно из названия, django-taggit реализовывает поддержку тегов. Делает он это на уровне модели с помощью специального менеджера. Неплохо кастомизируется и расширяется через through-модель, сам умеет создавать уже набившее всем оскомину облако тегов и делает некоторые другие стандартные вещи (типа добавить/удалить тег). Документация совсем небольшая, но исчерпывающая, поэтому на знакомство не уйдёт много времени.

Гитхаб
Доки

django-sphinx


Sphinx, популярный поисковый движок, — наше всё, благодаря его скорости, гибкости и способности учитывать особенности русской морфологии, чего не скажешь о его ближайших конкурентах. Несмотря на популярность, существует одно единственное решение-интегратор для Django — django-sphinx.

Что даёт?
  • полная поддержка Sphinx API <= 0.9.9
  • поисковые запросы через менеджер моделей, можно уточнять такие параметры как вес полей или названия индексов прямо в описании класса модели
  • на основе указанных параметров умеет автоматически генерировать sphinx-конфиг
  • псевдо`queryset (SphinxQueryset) на выходе, что также удобно для работы с выборкой
И в то же время:
  • есть проблемы при дополнительной обработке объекта выборки
  • несколько досадных открытых багов в оригинальном пакете django-sphinx (например, exception при использовании метода exclude), хотя они исправлены в нашем форке
  • совсем нет тестов, скудная документация
  • пакет не поддерживается и больше не развивается своим автором
В ближайшие дни мы поделимся с вами опытом работы с этим модулем и постараемся детально описать обнаруженные подводные камни. Масса нюансов тянет на отдельную статью.

Гитхаб (наш форк)

Полезные статьи (местами не совсем актуальные):

django-celery


По-настоящему незаменимая батарейка на более-менее крупных проектах, где без асинхронных задач не обойтись. Фактически, Celery — де-факто стандарт для реализации очередей в питоне, она обладает широким набором фич, поддерживает разнообразные бэкенды и имеет приятный API.

На Хабре была пара хороших статей о том как работать с celery, в том числе настройка и подводные камни при интеграции с Django:
Гитхаб
Документация

django-hosts


Модуль для управления роутингом урлов в зависимости от поддомена, у каждого из которых может быть свой собственный URLConf. Если ваш сайт имеет множество поддоменов, эта батарейка вам пригодится.

Гитхаб
Документация

P.S. Наш скромный вклад в опенсорс github.com/futurecolors и github.com/coagulant
Tags:
Hubs:
+52
Comments 42
Comments Comments 42

Articles