烧瓶返回响应但继续处理?

时间:2019-01-23 13:22:56

标签: python flask

我不确定我的措词是否正确,但是例如,我想返回响应而不返回函数。

我的上下文是,用户要求生成一个较大的excel文件,因此将向他返回一个链接,当excel完成后,还将发送一封电子邮件。

伪示例:

from flask import Flask
from flask import send_file
from someXlsLib import createXls
from someIoLib import deleteFile
from someMailLib import sendMail
import uuid

app = Flask(__name__)   
host = 'https://myhost.com/myApi'

@app.route('/getXls')
def getXls:
    fileName = uuid.uuid4().hex + '.xls'
    downloadLink = host + '/tempfiles/' + fileName
    #Returning the downloadLink for the user to acces when xls file ready
    return downloadLink
    #But then this code is unreachable
    generateXls(fileName)

def generateXls(fileName, downloadLink)
    createXls('/tempfiles/' + fileName)
    sendMail(downloadLink)

@app.route('/tempfiles/<fileName>')
def getTempFile:
    #Same problem here, I need the user to finish the download before deleting the file
    return send_file('/tempfiles/' + fileName, attachment_filename=fileName)
    deleteFile('/tempfiles/' + fileName)

1 个答案:

答案 0 :(得分:1)

其他评论者是正确的,您需要使用某些东西来管理异步操作。 Celery是最受欢迎的选项之一,它带有许多用于完成延迟,计划和异步操作的工具。您可以使用celery进行以下操作:

from celery import Celery

...

# This is for Redis on the local host. You can also use RabbitMQ or AWS SQS.
celery = Celery(app.name, broker='redis://localhost:6379/0')    
celery.conf.update(app.config)

...

# Create your Celery task
@celery.task(bind=True)
def generateXls(file_name, downloadLink):
    createXls('/tempfiles/' + fileName)
    sendMail(downloadLink)

@app.route('/getXls')
def getXls:
    fileName = uuid.uuid4().hex + '.xls'
    downloadLink = host + '/tempfiles/' + fileName
    # Asynchronously call your Celery task.
    generateXls.delay(file_name, downloadLink)
    return downloadLink

这将立即返回下载链接,同时在其自己的线程中继续generateXls