Как запланировать задачу в программе Django с помощью Heroku Scheduler

1656605773 kak zaplanirovat zadachu v programme django s pomoshhyu heroku scheduler

автор Альфархан Захеди

diVjQrNjmdmQFsb3D537Ww0qePe7gwSeljbc
https://unsplash.com/@agebarros

Недавно я опубликовал свою первую программу Django на Heroku.

Приложение довольно простое — оно перечисляет оценку, связанную с каждым классический проблема на SPOJ.

SPOJ — Sphere Online Judge — это архив набор проблем, онлайн-судья и служба хостинга конкурсов, принимающая решения на многих языках.

Вы можете найти приложение в прямом эфире здесь.

Программа использует библиотеки Python bs4 и requests чтобы очистить содержимое вышеуказанного веб-сайта, получить необходимые детали для каждой проблемы (а именно код проблемы, название проблемы, пользователей и оценка), и хранить его в базе данных.

Теперь оценка, связанная с проблемами на SPOJ, динамична. Он рассчитывается по формуле:

80 / (40 + количество_людей_решивших_проблему)

Следовательно, оценка, связанная с проблемами на SPOJ, изменяется как количество_людей, разрешивших_проблему изменения.

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

Теперь это мертвая простая программа. Поэтому я хотел настроить планировщик с наименьшим количеством конфигурации и кода.

Специальные команды управления Django и планировщик Heroku в помощь!

Давайте понять двух наших спасателей.

1. Специальные команды управления Django

Специальные команды управления Django структурированы как классы Python, которые наследуют свои свойства и поведение django.core.management.base.BaseCommand класс.

Они используются для добавления a manage.py действия для программы Django. runserver или migrate есть два таких действия.

Типичным примером такого класса может быть:

from django.core.management.base import BaseCommand
class Command(BaseCommand):    help = "<appropriate help text here>"    def handle(self, *args, **options):        self.stdout.write("Hello, World!")

Класс должен быть назван Commandи подкласс BaseCommand.

help должно содержать краткое описание команды, которое будет напечатано в справочных сообщениях.

handle(self, *args, **options) определяет фактическую логику команды. В этом случае мы просто пишем строчку Hello, World! в стандартный выход. в моем случае handle(self, *args, **options) выполняет задания скрейпинга веб-сайта — spoj.com и обновление базы данных, если оценка связаны с любыми проблемными изменениями.

handle(self, *args, **options) автоматически запускается, когда используется следующая команда:

python manage.py <name of the python script containing the management class>

Если название сценария, скажем, script.pyтогда команда будет:

python manage.py script

Обратите внимание, что метод handle объявляет три входных аргумента: self чтобы ссылаться на экземпляр класса, *args к ссылочным аргументам самого метода, и **option к аргументам ссылки, передаваемым как часть команды управления.

Где в структуре проекта это делается script.py идти?

(Здесь, script.py ссылается на название сценария, содержащего специальную команду управления Django.)

Это достаточно просто. Официальная документация хорошо объясняет:

Просто добавьте а management/commands каталог в программу. Django зарегистрирует a manage.py команда для каждого модуля Python в этом каталоге, имя которого не начинается символом подчеркивания.

Например:

polls/    __init__.py    models.py    management/        __init__.py        commands/            __init__.py            _private.py            closepoll.py    tests.py    views.py

В этом примере closepoll Команда будет доступна для любого проекта, содержащего файл polls применение в INSTALLED_APPS.

The _private.py модуль не будет доступен в качестве команды управления.

The closepoll.py модуль имеет только одно требование – он должен определить класс Command что распространяется BaseCommand или один из его подклассов.

Итак, если мы запустим такую ​​команду в нашем терминале:

python manage.py closepoll ,

handle(self, *args, **options) внутри closepoll.py будет запущен, и любая логика/задания, содержащиеся внутри вышеупомянутой функции, будут выполнены.

Моя структура проекта такова:

spojscore│   .gitignore│   manage.py│   Procfile│   README.md│   requirements.txt│   runtime.txt│├───core│   │   admin.py│   │   apps.py│   │   models.py│   │   tests.py│   │   views.py│   │   __init__.py│   ││   ├───management│   │   │   __init__.py│   │   ││   │   ├───commands│   │         script.py│   │         __init__.py│   │     │   ││   ├───static│   │   └───core│   │       ├───css│   │       │       style.css│   │       ││   │       └───img│   │               favicon.png│   │               logo.png│   ││   ├───templates│       └───core│               core.html│└───spojscore        settings.py        urls.py        wsgi.py        __init__.py

здесь, script.py содержит пользовательскую команду управления – код Python для очистки spoj.com, сбора деталей обо всех. классический проблемы и обновите базу данных.

Если вы видите, он находится внутри core\management\commands.

Если вам интересно, можете найти script.py здесь.

Я думаю, теперь понятно, что я могу очистить spoj.com и получить нужные данные, просто запустив python manage.py script от терминала.

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

2. Heroku Scheduler

Согласно веб-сайту Heroku:

Планировщик это бесплатное дополнение для выполнения задач в вашей программе через запланированные промежутки времени, как и cron в традиционной серверной среде.

Информационная панель позволяет настроить выполнение заданий каждые 10 минут каждый час или каждый день в определенное время. После вызова эти задачи будут выполняться как одноразовые динамики и отображаться в журналах как динамики с названием scheduler.X.

После развертывания программы установите добавление Heroku Scheduler.

Чтобы запланировать частоту и время выполнения задания, откройте информационную панель Heroku Scheduler, найдя приложение в разделе «Мои программы», нажав «Обзор», затем выбрав «Heroku Scheduler» из списка установленных дополнений.

На информационной панели планировщика нажмите «Добавить задание…», введите задание, выберите частоту, размер динамика и время следующего выполнения.

В моем случае задача такая python manage.py scriptкоторый будет выполняться каждый день (частота) с помощью моего бесплатного динамика (размер динамики) в 00:00 UTC (время следующего запуска).

08G0BBZMqdmB8njFB4vZzLvPfU5Yy6Wbmi65

Это!

Моя база данных будет ежедневно обновляться в 00:00 UTC, и мне не пришлось устанавливать дополнительные библиотеки Python или писать лишние фрагменты кода. Ура!

Если вы застряли, оставьте комментарий, и я сделаю все возможное, чтобы помочь вам.

Несколько последних примечаний:

  • На официальном сайте Heroku отмечено, что — «Выполнение работы планировщика ожидается, но не гарантируется. Известно, что планировщик иногда (но редко) пропускает выполнение запланированных задач. Если запланированные задачи являются критическим компонентом программы, рекомендуется запустить собственный процесс часов вместо этого для большей надежности, контроля и видимости». Этот момент следует помнить при использовании Heroku Scheduler.
    Mine – это простая программа, которая использует Heroku Scheduler для запуска простого сценария только раз в день. Так что, я думаю, это сделает отличную работу!
  • Моя программа, я считаю, полезна конкурентоспособным программистам. Почему? Я очень подробно объяснил это здесь.
  • Вы можете найти исходный код моего приложения здесь.

Произведение по моим личным размышлениям:

Я просто еще один программист-самоучка.

Я пишу код уже несколько лет и всегда хотел написать о своем опыте, попытках, неудачах и успехах.

Но, к сожалению, я не мог.

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

Честно говоря, сейчас так думаю.

Итак, почему я написал эту статью?

Ну, это будет моя первая из многих статей.

А причина смены, спросите вы?

Информационный бюллетень.

На прошлой неделе, как обычно, я получил еженедельный бюллетень от CSS-Tricks. «Эта неделя в веб-дизайне и разработке».

Вот отрывок из того же:

Удивительно иметь так много полезных ресурсов, которые могут помочь нам в любой момент: от сообщений в блоге и книгах до случайных докладов на конференции node.js, которые имеют всего 8 просмотров, и 7 из них мои. Так что я думаю, что эти выходные укрепили мою веру в ведение блогов и обмен тем, что вы знаете, где случайные заметки, оставленные в старом блоге какого-нибудь разработчика, очень помогли мне.

В любом случае, на подобной ноте, я много думал о том, как социальные сети предпочитают славу ценности. Если вы публикуете что-нибудь, например, на Medium, и оно получает только один хлопок, тогда вы чувствуете, что: зачем беспокоиться? Каков смысл, если эту вещь никто не читает? Но я считаю, что мы должны бороться с этой склонностью, чтобы получить популярность и популярность в социальных сетях, потому что мне интересно, сколько полезных сообщений в блоге и видео не было сделано просто потому, что кто-то думал, что он не получит полмиллиона лайков или ретвиты из него.

Мой совет после того, как в эти выходные научились от стольких полезных людей, таков: если вы думаете написать что-то, что объясняет то, с чем вы боролись, сделайте это! Не беспокойтесь о просмотрах, ругательствах и интернет-объятиях. Если вам трудно понять эту странную вещь, запишите ее, даже если она не отредактирована и в ней используется много ком, и вам не нравится ее тон.

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

Это оно. Эти несколько строк вдохновили меня написать свои усилия и опыт.

Может быть, вам тоже следует.

Добавить комментарий

Ваш адрес email не будет опубликован.