Правильный способ хранения определений (имен) функций Python в базе данных?

Контекст - перейти к "Сути" для tl;dr:
Я создаю систему автоматизации отчетов, которая включает в себя несколько независимых "рабочих" демонов, каждый из которых имеет свой собственный экземпляр APScheduler, одно центральное веб-приложение "панель управления" на Django и использует ZMQ для управления взаимодействием между Django и рабочими.

Рабочие задачи включают в себя запрос к базе данных, составление отчетов и сохранение и/или распространение экспортированных файлов этих отчетов. Все выполняется на одном сервере, но каждый сотрудник "назначен" в свое собственное подразделение со своими собственными данными, пользователями и задачами. Цель состоит в том, чтобы пользователи могли использовать веб-приложение для управления запланированными заданиями назначенного сотрудника. Я знаю о проблеме APScheduler (по крайней мере, в версии 3.x) с общим доступом к хранилищам заданий, поэтому вместо того, чтобы заставлять Django напрямую изменять хранилища заданий, я планирую использовать ZMQ для отправки сообщения JSON, содержащего инструкции, которые worker проанализирует и выполнит сам.

<время работы/>

Суть:
Чтобы веб-пользователь (предполагается, что у него нет навыков программирования) мог добавлять новые запланированные задания для worker, веб-приложение должно предоставить список "возможных задач", которые worker может выполнить. Поскольку задачи - это (в первую очередь) отчеты, которые должны быть созданы, пользователю проще всего использовать названия отчетов. Итак, на веб-странице Django пользователь нажимает кнопку "Добавить новое задание", которая открывает форму, в которой он выбирает отчет из выпадающего списка всех "возможных заданий" и вводит информацию о запуске задания.

Чтобы сделать его функциональным на рабочей стороне, мне нужно связать строку "report_name" с рабочей функцией для ее выполнения. Потенциально существуют сотни различных задач (т.е. отчетов), которые могут быть запланированы как задания, но многие из них могут обрабатываться одной и той же функцией с разными аргументами. В приведенном ниже примере предположим, что есть 4 возможных отчета, созданных двумя рабочими функциями, например, так:

func_1(A) -> report1A
func_1(B) -> report1B
func_2(A) -> report2A
func_2(B) -> report2B

Итак, когда веб-пользователь выбирает "Добавлять отчет1 ежедневно в 8 утра", Django отправляет это (упрощенный макет) json-сообщение через ZMQ работнику:

{"CMD" : "add_new_job", "TASK" : "report1A", "FREQ" : "daily0800"}

Я хочу, чтобы рабочий выполнил следующее:

self.scheduler.add_job(func=func_1,trigger=<crontrigger>,args=['A'])
<время работы/>

МОИ ВАРИАНТЫ:
Теперь я знаю, что самым простым способом сделать это было бы записать dict в worker, что-то вроде:

def task_lookup(report):
    task_dict = {
        'report1A' : [func_1, 'A'],
        'report2B' : [func_2, 'B']
    }
    task = task_dict.get(report)
    return task[0](task[1])

Причина, по которой я отказываюсь от этого, заключается в том, что мне нужно в первую очередь предоставить список возможных задач Django, чтобы пользователь мог выбрать из него. Если я закодирую это сопоставление "task->func+args" непосредственно в рабочий код, мне придется добавить дополнительный шаг для Django, чтобы запросить список ключей dict у рабочего, просто чтобы загрузить форму "Добавить новое задание" в веб-приложение. Что не обязательно плохо, но кажетсяненужным шагом в общении.

Что я хотел бы сделать, так это сохранить это отображение в крошечной таблице sqlite, которая была бы доступна как для Django, так и для Worker. Таблица была бы очень простой, например:

Report Function Arguments
report1A func_1 A
report2B func_2 B

Где я застрял, так это в преобразовании имени строковой функции обратно в ссылку на вызываемую функцию. Я действительно нашел эту ссылку на SO, которая, как я полагаю, выполняет то, что я пытаюсь выполнить, используя getattr(module, func_name), но на этот вопрос есть только один ответ, всего 2 голоса, и сделана 8 лет назад, поэтому я хотел убедиться, что она кошерная, прежде чем пытаться последовать ее примеру. Является ли этот процесс законным и является ли это лучшим способом сохранить "ссылку" на функцию в таблице базы данных?

Также:
Я действительно нашел другой источник о хранении функций в базах данных, но я совершенно уверен, что я не пытаюсь делать то, что описано здесь, что, по-видимому, хранить полное выполнение функции таким образом, чтобы ее можно было вызывать непосредственно из базы данных.

Вернуться на верх