Генераторы и корутины в Python

В предыдущей статье Итерируемые объекты, итераторы и генераторы в Python я уже затрагивал тему генераторов. В этой статье разберемся с тем, как работает оператор yield, и в чем разница между генераторами и корутинами. Будет проще понять эту статью, если прочитаете предыдущую. Генераторы Генератор – функция, которая генерирует последовательность значений, вместо одного значения, как это делает обычная функция. Любая функция, в которой есть оператор yieldявляется генераторной: Функция порождает (производит) числа…

Read More

Итерируемые объекты, итераторы и генераторы в Python

В статье разберемся, что такое итерируемые объекты, итераторы и генераторы. Узнаем тайну работы цикла for. Реализуем шаблон проектирования “Итератор”. А затем удалим все и сделаем “по-нормальному”, используя генераторы. Что такое итерируемый объект и итератор Итератор – любой объект, реализующий метод __next__, который возвращает следующий элемент в очереди или выбрасывает исключение StopIteration, если не осталось элементов. Итерируемый объект – любой объект, реализующий метод __iter__ или __getitem__. Итерируемым объектом является любая коллекция: список, кортеж,…

Read More

Где хранить бизнес логику в Django

Толстые модели (fat models), тонкие представления (thin views), тупые шаблоны (stupid templates) – один из распространенных подходов к структурированию Django приложений. Цель подхода – вынести бизнес логику из представлений и шаблонов, и поместить ее в модели. Очевидно, что представления и шаблоны не должны содержать бизнес логику, так как они имеют совсем другие обязанности. Но выносить логику в модели не лучший вариант. Это приводит к тому, что модели становятся…

Read More

SOLID: Принцип единственной обязанности

Хорошо спроектированная программа – программа, в которой: не страшно делать изменения; затраты на эти изменения – минимальны; легко тестировать Для того, чтобы писать такие программы, нужно практиковаться и знать о принципах проектирования хороших программ. Некоторые из таких принципов: DRY (Don’t repeat yourself); KISS (Keep it simple, stupid); YAGNI (You ain’t gonna need it); DDD (Domain Driven Design); Шаблоны проектирования; SOLID принципы; … Каждому, из этих…

Read More

Устраняем зависимости между объектами в Python

Хорошо спроектированная программа состоит из объектов, отвечающих принципу единственной обязанности (каждый объект делает только одну вещь, и делает это хорошо). Такие объекты постоянно “общаются” друг с другом. Для такого общения, один объект должен что-то знать о другом объекте, а это вызывает зависимость между ними. И зависимость между объектами неизбежна. Но сильная зависимость приводит к большим проблемам. Изменение одного объекта приводит к изменению другого объекта, а…

Read More

Namedtuple в Python

Функция collections.namedtuple позволяет построить класс, который содержит только поля и никаких методов. Экземпляр класса будет работать так же, как и обычный кортеж (tuple), только к элементам экземпляра класса можно будет обратиться через соответсвутющие имена, в отличие от обычного кортежа, где к элементам можно обратиться только через их индексы. В примере ниже определим кортеж для хранения информации о городе с помощью collections.namedtuple: Для создания именованного кортежа, нужно задать имя…

Read More

Расширяем модель User в Django

Для работы с пользователями, Django предоставляет готовую модель User. Часто, одной этой модели недостаточно. Приходится ее расширять, либо переписывать, если не устраивает стандартная реализация. Несколько причин, почему может не устраивать стандартная реализация: Вам нужно вместо двух полей first_name и last_name, одно поле full_name. Не устраивает то, что поле email – необязательно (blank=True). Не устраивает то, что USERNAME_FIELD = ‘username’. USERNAME_FIELD указывает на поле, которое является уникальным идентификатором для пользователя. Кроме того, это поле используется на…

Read More

Django + Elm. Аутентификация через JSON Web Token

JSON Web Token (JWT) – токен, который содержит минимально необходимую информацию для аутентификации и авторизации. В зашифрованном виде выглядит, как строка, которая состоит из трех частей: Header (заголовок). Содержит тип токена (в данном случае это JWT), и какой используется алгоритм шифрования. Payload (нагрузка). Содержит всевозможные данные (например, информацию о пользователе или время, через которое токен будет не действителен). Signature (подпись). Нужна для проверки, что токен не подделан и выдан…

Read More

Как реализовать систему лайков в Django

В статье мы реализуем функционал типичной кнопки “Мне нравится”. В этот функционал входит возможность: Добавлять лайк; Удалять свой лайк; Посмотреть общее количество лайков у объекта; Проверить, лайкнул ли пользователь объект или нет; Показать пользователей, которые лайкнули объект. Исходный код урока: https://github.com/apirobot/django-likes-app Первоначальные настройки Создаем и активируем виртуальное окружение: Устанавливаем django: Создаем проект: Объект, который мы будем лайкать в нашем тестовом проекте будет Твит. Этим объектом может быть…

Read More