Python Flask 不向客户端发送发射

Posted

技术标签:

【中文标题】Python Flask 不向客户端发送发射【英文标题】:Python Flask do not send emit to the client 【发布时间】:2017-12-05 10:12:48 【问题描述】:

在我的 Web 应用程序中,用户应该上传一个 .csv 文件,我的服务器读取它,进行一些计算,然后将计算中使用的命令发送回客户端,然后发出发射。

这是用于接收文件的python代码:

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also
        # submit a empty part without filename
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            stream = io.StringIO(file.stream.read().decode("UTF8"), newline=None)
            csv_input = pd.read_csv(stream,sep=None,engine='python')
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            command_used = "csv_input = pd.read_csv('<your_file_name>',sep=None,engine='python')"
            socketio.emit('bot_command_line_response','data': command_used, 'count': session['receive_count'])
            return redirect(url_for('uploaded_file',filename=filename))
    return render_template('index.html', async_mode=socketio.async_mode) 

在客户端,我有用于上传文件的表单:

<form id="upload" method = "POST" action='#'
     enctype = "multipart/form-data">
     <input type = "file" name = "file" id="file"/>
     <input type = "submit" value="Upload"/>
</form>

还有我网页上显示所用命令的区域:

socket.on('bot_command_line_response', function(msg) 
            $('#log_command_line').append('<br>' + $('<div/>').text('Command ' + msg.count + ': ' + msg.data).html());
        );

但是,当我上传文件时,该区域没有显示使用的命令。

感谢您的帮助。

【问题讨论】:

这里有点困惑,您尝试通过 WebSocket 或 SocketIO 上传文件,但是为什么您的 upload_file() 中有一个 POST 方法验证(针对 HTTP 请求完成)?这将失败,因此您的客户端将不会收到(您正在谈论的命令)来自该函数的发射。如果你真的想通过 WebSocket 上传文件,你需要使用write stream。 现在上传文件部分正在工作,经过我的编辑。问题是我没有在我的客户端服务器上收到 socketio.emit() 命令。我应该显示我应该通过这个命令接收的信息,但是每次我尝试从常规路线“/”做任何事情都没有发生。 【参考方案1】:

这就是我解决问题的方法:

    当我第一次上传文件时,我将文件名保存在服务器的 session 变量中。每次我需要使用该文件时,我都会重新阅读。 我知道这看起来不是最好的解决方案,但至少它有效。

谢谢你们。

【讨论】:

以上是关于Python Flask 不向客户端发送发射的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶-SocketIO + uWSGI。与 Mule 工人一起发射

你如何将消息从 Flask 服务器(Python)发送到 HTML 客户端?

Ionic 3 - Laravel - 不向客户端发送允许 CORS 的标头

通过 Websockets 从 Python Flask 服务器连续向客户端发送数据

通过Websocket从Python Flask服务器连续向客户端发送数据

Express/Passport 创建会话但不向前端发送 cookie