Тот учебный материал, что был предоставлен образовательной платформой (очень известной чтобы её называть) для изучения материала по "сельдерею с редиской" мне (моё оценочное суждение), оказался непонятным. Я попытался по пунктам разложить, как всё делал.
Итак, скачаем контейнер redis:
Затем его нужно запустить:
Можно запустить контейнер в интерактивном режиме, будут отображаться все сообщения:
Можно в фоновом:
Завершить работу контейнера можно командой
Проверить работу контейнера можно командой, она покажет только запущенные контейнеры:
Вывести все контейнеры можно той же командой что и выше, с ключом -а:
Итак, redis у нас запущен, теперь дело за celery, его так же нужно запустить как типа сервер-задач, иначе программа не будет отрабатывать:
Запускал я его из той директории где находится файл tasks.py. Затем мне пришла в голову идея - а может запуск celery не нужен, я просто выполню в консоли файл tasks.py ???
И... я попробовал его запустить, только вот незадача, без запущенного celery задачи не выполняются, пришлось скрипт завершать сочетанием клавиш Ctrl+C:
Понятно, без celery -A tasks worker скрипт не может завершить работу... Запустил celery и повторил те же самые команды, теперь получил ответ:
Практическая работа:
Представьте, что пользователь загружает на сервис некоторое количество изображений, указывая свою почту. Ко всем изображениям применяется эффект размытия. Изображения отправляются ему на почту в виде архива или списка изображений по мере готовности.
Реализуйте следующие endpoints:
POST /blur
Ставит в очередь обработку переданных изображений. Возвращает ID группы задач по обработке изображений.
GET /status/<id>
Возвращает информацию о задаче: прогресс (количество обработанных задач) и статус (в процессе обработки, обработано).
POST /subscribe
Пользователь указывает почту и подписывается на рассылку. Каждую неделю ему будет приходить письмо о сервисе на почту.
POST /unsubscribe
Пользователь указывает почту и отписывается от рассылки.
Функции для обработки изображения и отправки письма уже реализованы, поэтому можете сконцентрироваться на внедрении очереди задач.
Начнем с того что нужно запустить все необходимые сервисы для работы нашего приложения (при условии, что ранее все зависимости были установлены, см. выше):
Итак, создадим эндпойнт, который будет загружать картинки на сервер, все эндпойнты будут прописаны в файле app.py
Пройдем по ссылке "Загрузить изображения". Открывается форма выбора файлов для загрузки. Можно выбрать сразу несколько файлов.
Выбрали несколько изображений, нажали, кнопочку "Отправить", изображения попали на сервер, колёсики завертелись, что-то стало там происходить и мы получаем ответ в виде id группы задач.
А в директории проекта появилась папка куда будут загружаться изображения до и после обработки (после обработки имена файлов будут отличаться словом "blur_":
Ну теперь посмотрим из чего состоит эндпойнт /blur, так сказать - что же происходило под капотом нашего сервера обработки изображений.
Итак, это у нас эндпойнт, посмотрим как происходит постановка задач, изначально файл был назван celery.py, мне пришлось его переименовать чтобы не было конфликтов при использовании имени celery. Теперь он у меня celery_tasks.py:
В консоли, где запущен сервер celery, происходит следующее:
Изначальный файл image.py, я тоже немного доработал, возможно не в самую лучшую сторону, но это работает. Потому что в начальной версии был просто приём файлов, без указания директорий для загружаемых файлов а это мне не очень нравилось. И была аннотация типов, которая почему то "ругалась" на то что мол у меня "не строка", а как не строка если путь к файлу и есть строка!? Поэтому не стал заморачиваться и чуть подправил данный файл. Возможно куратору это не понравится...
Следующий пункт, теперь отблюренные файлы нужно заархивировать и отправить в качестве рассылки на все зарегистрированные email'ы.
В первом эндпойнте мы получаем id групповой задачи, я сделал так чтобы этот id тут же передавался через строку адреса браузера в получение статуса выполнения задачи:
Так же можно вбить group_id в поле ввода и так же получить на почту архив с отблюренными снимками.
Работает это так:
Примерно так же работает с шаблоном, в котором есть поле для ввода group_id.
Теперь осталось написать обработку периодических задач. А так же подписку и отписку от рассылки писем один раз в неделю от нашего блюр-сервиса.
Хотел было сначала хранить все адреса электронной почты в глобальной переменной типа список, но передумал в пользу базы данных sqlite (хотя, может и зря).
Итак, подписка, вводим email:
Создаем базу данных emails, с одной таблицей и вставляем в таблицу адрес электронной почты полученный из формы для ввода.
Отписка еще проще:
Теперь про запуск периодических задач. Чтобы периодические задачи выполнялись worker тоже должен быть запущен:
У меня он запущен в отдельном окне терминала. Как я его запускал, по порядку с докером и редис:
А затем уже из терминала в Pycharm запустил планировщик периодических задач.
Долго не мог понять почему не запускаются задачи по времени, а тут непонятная мне фишка с UTC, у меня мозг отказывается понимать как правильно записывать время. Вот фактически у меня сейчас 8 часов вечера а в скрипте приходится указывать на 3 часа меньше.
Я тут немного испытывал свой код в разных режимах и рассылка шла на 2 действительных электронных адреса, которые задача считывала из базы данных.
Давайте посмотрим, сколько писем я написал сам себе пока испытывал программу:
Я попытался снять видео с тем как я запускал всё это добро, вдруг кому-то пригодится, видео без обрезки, плюс там выскакивает ошибка, от кучи задач которые сохранились со вчерашнего вечера (это я сегодня пришел с работы и включил домашний комп, чтоб снять видео) хотя всё равно всё работает, так что не обессудьте: