首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python flask:异步请求

python flask:异步请求
EN

Stack Overflow用户
提问于 2018-11-01 23:07:34
回答 1查看 5.1K关注 0票数 0

在flask视图中,我通过API调用接收数据,这些数据必须传递到有时非常慢的外部API。

因此,我希望视图在异步处理请求时返回一个肯定的状态代码。

我已经尝试过请求期货,但在回调时遇到了问题:

代码语言:javascript
复制
def bg_cb(sess, resp):
    print(resp.text)

@app.route('/incomingdata', methods=['POST',])
def clients():

    (... process incoming POST data and create outgoing API call. here I inserted a demo call to httpbin.org that simulates a very slow API ...)

    from requests_futures.sessions import FuturesSession
    session = FuturesSession()
    future = session.get('http://httpbin.org/delay/3', background_callback=bg_cb)
    response = future.result()

    return jsonify({'status': 'ok'}), 200

不幸的是,上面的代码将等待返回,直到回调处理完毕。这里是3秒。

我如何才能达到这样的结果,视图立即返回200响应,3秒后回调函数被调用。

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2018-11-06 17:36:35

如果只需要异步调用,就不应该使用result()result()方法将一直等到background_callback完成。举个例子:

代码语言:javascript
复制
def bg_cb(sess, resp):
    print('done')

# in view:
print('call async...')
session.get('http://httpbin.org/delay/3', background_callback=bg_cb)

return jsonify({'status': 'ok'}), 200

调用端点,您将看到没有延迟的响应。控制台输出:

代码语言:javascript
复制
call async...
# after few seconds
done

现在让我们等待回调完成:

代码语言:javascript
复制
future = session.get('http://httpbin.org/delay/3', background_callback=bg_cb)
print('wait result...')
response = future.result()
print('after result...')

调用端点,您将看到带有延迟的响应。控制台输出:

代码语言:javascript
复制
wait result...
done
after result...

因此,如果您只需要异步运行某些东西,则不需要result()

如果需要特定的异步处理,也可以使用rqcelery

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53103990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档