如何在烧瓶中发布请求后使用 websockets 向客户端发送警报
Posted
技术标签:
【中文标题】如何在烧瓶中发布请求后使用 websockets 向客户端发送警报【英文标题】:How to send an alert to client using websockets after post request in flask 【发布时间】:2018-11-11 04:40:00 【问题描述】:发布请求后如何向客户端发送消息?我将发布请求中的数据存储到数据库中,并且我想通知客户端数据库已更改。有没有办法将restapi与websocket结合起来?我发现的示例是使用 websockets 接收数据并发送到客户端,而我正在使用 post 方法接收并希望使用 websocket 发出警报。任何帮助,将不胜感激。
server.py
import sqlite3
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/', methods=['GET'])
def index():
render_template('index.html')
# listen for data
@app.route('/listen/<data>',methods=['POST'])
def listen(data):
# insert to db
conn = sqlite3.connect('storage.db')
c = conn.cursor()
c.execute('''CREATE TABLE info(num text)''')
c.execute('''INSERT INTO info(num) VALUES(?)''',(data))
conn.commit()
conn.close()
#send alert to client
@socketio.on('message')
def handle_message(message):
send(message)
if __name__ == '__main__':
socketio.run(app)
index.html
<head>
<script type="text/javascript"src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('message', function(data)
console.log(data);
);
</script>
</head>
【问题讨论】:
【参考方案1】:你只是弄错了。您来自 flask-socketio 的 send
或 emit
应该是 POST 请求之后的最后一条语句,如下所示:
import sqlite3
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/', methods=['GET'])
def index():
render_template('index.html')
# listen for data
@app.route('/listen/<data>',methods=['POST'])
def listen(data):
# insert to db
conn = sqlite3.connect('storage.db')
c = conn.cursor()
c.execute('''CREATE TABLE info(num text)''')
c.execute('''INSERT INTO info(num) VALUES(?)''',(data))
conn.commit()
conn.close()
emit('message', 'Change has been made', broadcast=True) # To send all who listen
# This part is, if client sends to server something through 'message' socket. You don't need that,
# @socketio.on('message')
# def handle_message(message):
# send(message)
if __name__ == '__main__':
socketio.run(app)
因为客户端侦听来自“消息”套接字的消息,所以您需要在 index.html 中像这样处理它:
<head>
<script type="text/javascript"src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('message', function(data)
console.log(data);
);
</script>
</head>
有客户端和服务器端。
他们都用 socket.on()
监听一些变化。他们使用send()
和emit()
发送消息或发出消息。
客户端可以通过“ImHere”套接字发出 -> 服务器将使用socket.on('ImHere')
处理该消息 -> 服务器可以使用emit
或send
启动其他套接字,比如说“消息”套接字->客户端可以使用 `socket.on('message', function(data)...) 来处理它。
【讨论】:
【参考方案2】:@Dinko 提到的一切都已到位,您只需要在 conn.close() 之后的监听函数中再添加一个,即:
socketio.emit('message', 'data': 'Records Affected', broadcast=True)
您的回调函数将被触发,因为它会听到“消息”套接字。
这里还要添加一件事,如果您有特定频道的命名空间,那么您也需要传递它
socketio.emit('message', 'data': 'Records Affected', broadcast=True, namespace='/test')
希望这会有所帮助..!
【讨论】:
以上是关于如何在烧瓶中发布请求后使用 websockets 向客户端发送警报的主要内容,如果未能解决你的问题,请参考以下文章