我刚开始使用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)
我的celera有redis配置:
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)
和ExtractFeatures()
函数:
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")
我的期望是在“完成提取功能”之前打印“已完成的请求”,但我得到上面显示的错误。
答案 0 :(得分:0)
在Web应用程序中实现长时间运行的进程通常是一个糟糕的主意。
典型的解决方案是将消息写入某种类型的队列(SQS,Celery,磁盘上文件等),并实现单独的工作进程以运行更长的操作。
如果您需要在操作完成时通知用户,您可以为此目的在消息中提供数据,将结果写入另一个队列,并让客户端进程检查。