烧瓶将"ok"返回给用户并处理数据



我刚开始使用flask,我正在制作一个可以处理一些请求的服务器应用程序,现在对于POST请求部分,它有一个需要一些时间的过程,这意味着我必须让用户在移动应用程序上等待,直到我对他发送的第一个POST请求做出响应。

是否有某种方法可以将OK返回到移动应用程序并在后台处理数据?

到目前为止,我的想法是:-

if request.method=='POST':
#signal another process ( another python file for example) to start with parameters from the request 
return "OK"

然而,我不确定这是最好的做法,还有其他想法吗?

编辑

根据安装芹菜的建议,我已经下载并将其与redis一起安装在windows上。我有一个经纪人工作人员Celery在运行,但当我试图发出POST请求时,我得到了以下信息:

TypeError: ExtractFeatures() takes exactly 2 arguments (1 given)

对于我的带有redis配置的celera:

from flask import Flask
from celery import Celery
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

对于CCD_ 2函数:

def ExtractFeatures(JsonRecieved):
#testing for now sleep for 5 seconds to make sure code executes this 
#function parallel and finishes the request handling
time.sleep(5)
print("finished Extracting Features")

对于POST请求:

@app.route('/PostPhotos',methods=['POST'])
def api_PostPhotos():
if request.method=="POST":
ExtractFeatures.delay(request.json)
return("finished request")

我的期望是在"完成提取特征"之前打印"完成的请求",但我得到了上面显示的错误。

在web应用程序中实现长时间运行的流程通常是个糟糕的主意。

典型的解决方案是将消息写入某种类型的队列(SQS、Celery、磁盘上的文件等),并实现单独的工作进程来运行较长的操作。

如果需要在操作完成时通知用户,可以在消息中为此提供数据,将结果写入另一个队列,并让客户端进程进行检查。

最新更新