Колба возвращает ответ, но продолжает обрабатывать? - PullRequest
0 голосов
/ 23 января 2019

Я не уверен, правильно ли я сформулировал вопрос, но, например, я хочу вернуть ответ, не возвращая функцию.

Мой контекст здесь таков, что пользователь запрашивает большой файл 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 голосов
/ 23 января 2019

Другие комментаторы правы, что вам нужно что-то использовать для управления асинхронными действиями. 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 в его собственной теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...