Как автоматизировать планирование с помощью дополнительной конфигурации - PullRequest
1 голос
/ 05 апреля 2020

Учтите, что мне нужно часто отправлять автоматические отчеты по электронной почте своим клиентам. Поскольку у меня может быть несколько клиентов, и один клиент может запрашивать ежедневные и / или еженедельные отчеты, я хочу сохранить их в файле json как report_config.json и автоматизировать его с помощью модуля python schedule.

То, что я пробовал до сих пор:

report_config.json выглядит следующим образом:

{
    "cusomer1": [
        {
            "report_type": "twitter",
            "report_frequency": "daily",
            "receivers": [
                "example@example.com"
            ]
        },
        {
            "report_type": "twitter",
            "report_frequency": "weekly",
            "receivers": [
                "example@example.com"
            ]
        }
    ],
    "customer2": {
        "report_type": "twitter",
        "report_frequency": "daily",
        "receivers": [
                "example@example.com"
            ]
    }
}

Как будто я хочу сохранить требования клиента по электронной почте в списке в качестве его значения в файле конфигурации. Тогда я oop до конца и наметить их. то есть:

if __name__ == "__main__":
    for customer, reports in report_config.items():
        for report in reports:
            # below is an example of scheduling and not working as I want to achieve right now
            schedule.every().days.at('03:00').do(preprare_report,
                                                 report['report_type'], report['report_frequency'])
            schedule.every().monday.at('03:00').do(preprare_report,
                                                   report['report_type'], report['report_frequency'])

    while True:
        schedule.run_pending()
        time.sleep(1)

Но, как вы видите, клиент может требовать электронные письма только ежедневно. Еще один может захотеть каждый понедельник и каждый день. Но я не могу автоматизировать часть кода schedule.every().monday/days, поскольку они являются методами, а не аргументами.

Я знаю, что могу делать то, что хочу, с помощью нескольких операторов if-else. Но по мере того, как клиенты и их требования растут, с жестким кодированием это станет неприемлемым. Знаешь, это будет больно:

if report['day'] == 'monday':
    schedule.every().monday.at('03:00')...
elif report['day'] == 'tue':
    ...

И даже день здесь не единственный параметр. Итак, какие-либо советы о том, как добиться полностью автоматизированной системы? Я могу дать любую дополнительную информацию, которая вам нужна. Спасибо.

1 Ответ

0 голосов
/ 05 апреля 2020

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

«Celery - это асинхронная очередь задач / очередь заданий, основанная на распределенной передаче сообщений. Он ориентирован на работу в реальном времени, но также поддерживает планирование. "

Вы можете использовать задания сельдерея с периодом c задач для динамического планирования ваших заданий / заданий на основе интервалов или crontab.

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