Skip to main content
 首页 » 编程设计

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

2024年09月03日49tintown

发送请求后如何向客户端发送消息?我将 post 请求中的数据存储到数据库中,我想通知客户端数据库已更改。有没有办法将 restapi 与 websocket 结合起来?我发现的示例是使用 websockets 接收数据并发送给客户端,而我正在使用 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 发送的 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){...}) 在他们这边处理它。