Python 在flask api中实际响应之前发送确认消息

Python 在flask api中实际响应之前发送确认消息,python,multithreading,flask,flask-socketio,Python,Multithreading,Flask,Flask Socketio,我正在从事一个项目,客户发送一些图像,并根据这些图像生成三维网格,并在整个过程完成后返回“生成网格”的消息 目前,单个流程大约需要半个小时。执行时间将根据请求而增加,因为生成网格的软件一次只运行一次,所以其他请求必须等待执行 我想向客户端发送一条消息,在网格创建后生成的实际响应之前,他们的图像已经上载,这样用户就不必等待太长时间而服务器端没有任何响应 我一直在开发简单的FlaskAPI应用程序。以下是迄今为止的代码 import os import urllib.request from fla

我正在从事一个项目,客户发送一些图像,并根据这些图像生成三维网格,并在整个过程完成后返回“生成网格”的消息

目前,单个流程大约需要半个小时。执行时间将根据请求而增加,因为生成网格的软件一次只运行一次,所以其他请求必须等待执行

我想向客户端发送一条消息,在网格创建后生成的实际响应之前,他们的图像已经上载,这样用户就不必等待太长时间而服务器端没有任何响应

我一直在开发简单的FlaskAPI应用程序。以下是迄今为止的代码

import os
import urllib.request
from flask import Flask, request, redirect, jsonify
from werkzeug.utils import secure_filename
from datetime import datetime
# import threading
from time import sleep
from flask_socketio import SocketIO, emit

UPLOAD_FOLDER = r'C:\Users\Pro-MechPC5\Desktop\ImageTest\Server\upload'

if not os.path.exists(UPLOAD_FOLDER):
    os.makedirs(UPLOAD_FOLDER)

app = Flask(__name__)
# socketio = SocketIO(app)

# @socketio.on('connect')                                                         
# def connect():                                                                  
#     emit('message', {'hello': "Hello"}) 
#app.secret_key = "secret key"
# app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/get_files', methods=['POST'])
def upload_file():
    info = dict(request.form.items())
    print(list(info.keys()))
    keys = list(info.keys())
    if 'meshname' not in keys:
        resp = jsonify({'message' : 'Please provide us your meshname.'})
        resp.status_code = 400
        return resp

    if 'email' not in keys:
        resp = jsonify({'message' : 'Please provide us your email id.'})
        resp.status_code = 400
        return resp

    # check if the post request has the file part
    if 'files[]' not in request.files:
        resp = jsonify({'message' : 'No file part in the request'})
        resp.status_code = 400
        return resp

    
    files = request.files.getlist('files[]')
    # datetime object containing current date and time
    now = datetime.now()
    # dd/mm/YY H:M:S
    email_id = info['email'].split('@')[0]
    sub_foldername = str(now.timestamp()) + '_' + info['meshname'] + '_' + email_id 
    print(sub_foldername)
    folder_name = UPLOAD_FOLDER + '\\' + sub_foldername
    

    if not os.path.exists(folder_name):
        os.makedirs(folder_name)

    print(folder_name)
    app.config['folder_name'] = folder_name
    errors = {}
    success = False
    
    for file in files:      
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['folder_name'], filename))
            success = True
        else:
            errors[file.filename] = 'File type is not allowed'
    
    if success and errors:
        errors['message'] = 'File(s) successfully uploaded'
        resp = jsonify(errors)
        resp.status_code = 500
        return resp
    if success:
        resp = jsonify({'message' : 'Files successfully uploaded'})
        resp.status_code = 201
        print()
        print("***************Starting MeshGen******************")
        # threading.Thread(target=create_mesh).start()
        #Send message (Images uploaded successfully, Mesh creation is in progress) here. 
        create_mesh()
        print()
        return resp
    else:
        resp = jsonify(errors)
        resp.status_code = 500
        return resp

def create_mesh():
    print("Started Task ....")
    # print(threading.current_thread().name)
    sleep(10)
    print('completed')

if __name__ == "__main__":
    app.run(debug=True)
我尝试使用线程,将实际的网格创建作为后台任务运行,并立即发送响应。但是,它导致了一个问题,即当有多个请求时,它为网格生成创建了多个线程,这使得所有请求并行工作,因此,所有用户都必须等待几乎相同的时间,这是我不希望的。我想以先进先出的方式执行请求

我研究过芹菜,socketio with flask,但我找不到很好的参考资料,也没有正确理解这些库,因为我之前没有在flask及其库上工作的经验

那么,在最终响应之前,我如何向客户发送一些消息呢。或者,比方说,我如何在flask中为单个请求发送多个响应


或者如何为线程生成队列(最后一个选项,我认为这会更复杂),以便一次只运行一个线程。

我建议在用户上传图像后立即使用javascript显示响应。您可以选择表单提交按钮,并定义“提交”事件侦听器。因此,如果用户上传了图像,javascript可以发出警报或类似的响应