Celery + Channels = <3. Создаем реал-тайм приложение с бэкграунд тасками

В статье создадим веб-приложение, которое в бэкграунде делает запросы к API со случайными шутками каждые 15 секунд, затем отправляет шутку пользователю через WebSocket. Для реализации приложения будем использовать: django, celery и channels. Celery для бэкграунд задач. Channels для передачи сообщений через WebSocket. Конечный результат на картинке: Исходный код проекта: https://github.com/apirobot/django-channels-celery-jokes Содержание Что такое celery Что такое channels Создаем проект Создаем приложение Создаем бэкграунд задачу Подключаем библиотеку…

Read More

Django + Vue. Реализуем вход через Google

Никто не любит при регистрации на сайте вводить каждый раз одно и то же: имя пользователя, электронную почту и т.д. Либо постоянно создавать и запоминать новые пароли. По этой причине, вход через сторонние приложения вроде Google, Facebook или VK очень популярен. Такие сторонние приложения используют протокол OAuth2. В статье я не буду объяснять, что это за протокол и как его реализовать. Вместо этого реализуем вход…

Read More

Генераторы и корутины в 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