python - 如何在 flask 中发布请求后使用 websocket 向客户端发送警报

标签 python rest post flask websocket

发出 post 请求后如何向客户端发送消息?我将发布请求中的数据存储到数据库中,并且我想通知客户端数据库已更改。有没有办法将restapi与websocket结合起来?我发现的示例是使用 websocket 接收数据并发送给客户端,而我使用 post 方法接收并希望使用 websocket 来发出警报。任何帮助,将不胜感激。

服务器.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>

最佳答案

你只是以错误的方式得到了它。来自flask-socketio的sendemit应该是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){...}) 在自己这边处理它。

关于python - 如何在 flask 中发布请求后使用 websocket 向客户端发送警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53245902/

相关文章:

python - 如何在 flask 中获取http header ?

java - 内部 Web 服务的最佳实践

rest - 使用 https ssl 调用 rest API 时找不到 404

grails - 使用 POST 请求重定向

ios - React Native 获取网络请求失败 iOS

internet-explorer - 如何使 IE 以 UTF-8 格式发布 FORM 数据?

python - 写入后无法使用 go 从文件中读取字节

python - 为什么 (3.3==np.asarray([3.3])) 等于 [True] 而不是 False?

python - 在扭曲试验中超时后没有调用 tearDown?

json - 在 JSON API 中表示部分日期