如何 "auto-schedule" 使用 celery 调用它的端点的执行?

How to "auto-schedule" the execution of a endpoint calling it using celery?

我有一个使用 Flask 和 Celery 的应用程序。现在我有一个名为“/get-products”的端点,但我希望在我调用它时安排它。

我想要的是调用那个端点,它自己安排,而不触发其他功能或任何东西

有办法吗?

这是总体思路:

创建一个函数,该函数将在名为 get_products_task 的函数中执行实际处理,并用 @celery_task 修饰它。然后 /get-products 的端点函数将确定它希望在未来多少秒 运行 芹菜任务并相应地安排它。例如:

@celery_task
get_products_task():
    with app.app_context(): # if an application context is required
        ...


@app.route('/get-products')
def get_products():
    task = get_products_task.apply_async(countdown=120)
    return render_template('schedule_get_products_template.html'), 202
    #return '/get-products has been scheduled!', 202

如果有时不延迟地调用 /get_products 端点,那么它的逻辑 确实应该分解成一个单独的函数,例如,get_products_logic:

def get_products_logic():
    """
    The actual logic for getting products.
    The assumption is that an application context exists, if necessary.
    """
    ...
        
@celery_task
def get_products_task():
    with app.app_context(): # if an application context is required
        get_products_logic()

@app.route('/get-products')
def get_products():
    get_products_logic()
    return reneder_template('get_products_template.html'), 200

@app.route('/schedule-get-products')
def schedule_get_products():
    task = get_products_task.apply_async(countdown=120)
    return render_template('schedule_get_products_template.html'), 202
    #return '/get-products has been scheduled!', 202