#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