Как «автоматически запланировать» выполнение конечной точки, вызывающей ее с помощью сельдерея?

#python #python-3.x #flask #celery

Вопрос:

У меня есть приложение, использующее колбу и сельдерей. Прямо сейчас у меня есть конечная точка под названием «/get-products», но я хочу, чтобы она была расписана, когда я ее вызываю.

То, что я хочу, — это назвать эту конечную точку, и она сама по себе, без какой-либо другой функции или чего-либо еще

Есть ли способ сделать это?

Ответ №1:

Это общая идея:

Создайте функцию, которая будет выполнять фактическую обработку, например, в функции с именем, get_products_task и украсьте ее @celery_task . Затем ваша функция конечной точки для /get-продуктов определит, через сколько секунд в будущем она захочет запустить задачу сельдерея, и запланирует ее соответствующим образом. Например:

 @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