Как создать периодическую задачу celery в django rest framework Views?

Я использую django rest framework.

Я хочу, чтобы задача celery выполняла операцию один раз на дату, которую вводит пользователь...

вот мой celery conf:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Bimsanj.settings')

celery_app = Celery('Bimsanj')

celery_app.conf.task_queues = (
    Queue('default', routing_key='default'),
    Queue('reminder', routing_key='reminder'),
)

celery_app.conf.task_default_queue = 'default'

celery_app.conf.task_routes = {
    'send_reminder_message_task' : {'queue' : 'reminder'},
}

# Load task modules from all registered Django apps.
celery_app.autodiscover_tasks()

celery_app.conf.broker_url = BROKER_URL
celery_app.conf.result_backend = RESULT_BACKEND

и это мой взгляд:

class InsuranceReminderView(GenericViewSet, CreateModelMixin):
    serializer_class = InsuranceReminderSerializer
    model = InsuranceReminder

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        clocked = ClockedSchedule.objects.create(serializer.validated_data['due_date'])
        PeriodicTask.objects.create(
            clocked=clocked,
            name=str(uuid4()),
            one_off=True,
            task="apps.insurance.tasks.send_message_insurance_reminder",
            args=([serializer.validated_data['title'],
                    serializer.validated_data['mobile'],
                    serializer.validated_data['due_date']])
        )
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

и это моя задача:

logger = get_task_logger(__name__)

@celery_app.task(name="apps.insurance.tasks.send_message_insurance_reminder")
def send_message_insurance_reminder(title, mobile, due_date):
    logger.info('send message insurance reminder')
    # return send_reminder_message(title, mobile, due_date)
    return f'{title} _ {mobile} _ {due_date}'

Каков правильный способ создания периодической задачи и выполнения задачи в дату, которую вводит пользователь?

Спасибо.

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