Я пытаюсь создать асинхронный API с помощью Flask. Я выбрал Celery с Redis в качестве брокера и бэкэнда, но открыт для любой другой реализации.
В настоящее время мне удалось реализовать асинхронные задачи, но только с получением ответа на другой URL-адрес, чем запрос. Вопрос в том, как я могу получить ответ на тот же URL?
Пожалуйста, см. Упрощенный код ниже:
#here goes Flask app and Celery app set up and initialization...
#Then I define long task that I need to run async
@celery.task(bind=True)
def very_long_task(self, number):
result = number * number
time.sleep(10)
return {'result': result}
#here I define the route to launch very long task
@application.route('/launchlongtask/<int:number>', methods=['POST', 'GET'])
def launchlongtask(number):
task = very_long_task.apply_async(args=[number])
return redirect("/statusofthelongtask/" + task.id, code=302)
# and this is route that will return the results
@application.route('/statusofthelongtask/<task_id>')
def longtaskstatus(task_id):
task = very_long_task.AsyncResult(task_id)
if task.state == 'PENDING':
result = {'status': 'Pending...'}
elif task.state != 'FAILURE':
result = {}
if 'result' in task.info:
result['result'] = task.info['result']
else:
result = {'status': str(task.info)} # this is the exception raised
return jsonify(result) # the result is shown but at another URI - not at '/launchlongtask/<int:number>'
Вопрос: Как я могу получить результаты по начальному URL-адресу, на который пользователь отправляет запрос ('/ launchlongtask /')?
Спасибо большое!
P.S. пример адаптирован из этого замечательного урока:
https://blog.miguelgrinberg.com/post/using-celery-with-flask