Как построить асинхронный API с помощью Python, используя один URL? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать асинхронный 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

...