如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO
Posted
技术标签:
【中文标题】如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO【英文标题】:How to access formData in flask sent using websockets?Flask-SocketIO 【发布时间】:2016-08-08 05:06:35 【问题描述】:如何使用 Web 套接字访问发送到 Flask 的表单数据?我在谷歌浏览器开发者工具->控制台中收到无效的帧头。
从我的 javascript 代码中提取:
var form_data = new FormData($('#my_form')[0]);
socket.emit('handle_form',data:form_data);
如何从烧瓶访问 my_form 中的“标题”字段?
request.form 抛出同样的错误“Invalid frame header”
还有一个问题,使用 web sockets 提交表单并完全替代 ajax 是否好?
【问题讨论】:
那么在上传图片时如何将文件保存在烧瓶中?无法执行 request.files.getlist()。有什么解决办法吗? 【参考方案1】:您应该构建一个普通的字典并发送它,而不是发送 FormData
对象,这是一个仅限客户端的构造,因为在 Socket.IO 中来回传输的所有数据都被序列化为 JSON。
然后在服务器上,您将拥有一个作为参数发送给您的套接字回调函数的 dict。请参阅此example,了解如何将表单数据发送到服务器。
【讨论】:
如何将要上传的文件添加到javascript,以便可以使用flask文件对象访问? 再一次,不要从表单提交的角度去想,那是一个 HTTP 的东西,当你使用 WebSocket 或 SocketIO 时是不存在的。如果您想发送文件,只需在emit
调用中发送数据即可。
同样的事情,对不起,我是初学者,但无法弄清楚如何在 emit 中发送文件!因为在使用 ajax 时,我使用了 javascript 的 formData。
浏览器在通过 HTTP 发送文件时做了很多工作。然而,对于 WebSocket,你得到的只是一个用于写入数据的通信通道。如果要发送文件,则需要在 javascript 中读取文件,然后将这些内容包含在您发送的有效负载中。为什么不直接使用 ajax 调用来发送文件?除非您必须经常这样做,否则使用 Socket.IO 并没有真正的好处。
没想到ajax和socketio一起用。再次感谢 :) 在实时聊天的背景下,让用户也分享图像是什么?单独的ajax调用来上传图像并在聊天中发出文本?这就是我的情况。【参考方案2】:
这不像Flask-SocketIO
工作。
当您socket.emit
某事时,您会通过回调处理它。
@socketio.on('handle_form')
def handle_form_callback(data):
print('received message: ' + data)
在这种情况下,您没有request.form
。
它可以作为表单提交的替代品,但我认为它不是一个好的替代品。 Websockets 不是无状态的,它们难以扩展并且本质上绑定到服务器。当然,它有一些变通方法,但它不像有详细记录的 HTTP 服务器缩放。
【讨论】:
那么在上传图片时如何将文件保存在烧瓶中?无法执行 request.files.getlist()。有什么解决办法吗? 可以通过websocket将数据作为二进制字符串发送,但我不推荐。它不支持分段上传之类的东西。使用普通的 HTTP POST 来完成。以上是关于如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google Cloud Platform 运行 Websocket