Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在flask中post请求后使用WebSocket向客户端发送警报_Python_Rest_Post_Flask_Websocket - Fatal编程技术网

Python 如何在flask中post请求后使用WebSocket向客户端发送警报

Python 如何在flask中post请求后使用WebSocket向客户端发送警报,python,rest,post,flask,websocket,Python,Rest,Post,Flask,Websocket,发出post请求后,如何向客户端发送消息?我将post请求中的数据存储到数据库中,并希望通知客户机数据库已更改。有没有办法将restapi与websocket结合起来?我发现的示例是使用websocket接收数据并发送到客户端,而我使用post方法receive并希望使用websocket发出警报。任何帮助都将不胜感激 server.py import sqlite3 from flask import Flask, render_template from flask_socketio imp

发出post请求后,如何向客户端发送消息?我将post请求中的数据存储到数据库中,并希望通知客户机数据库已更改。有没有办法将restapi与websocket结合起来?我发现的示例是使用websocket接收数据并发送到客户端,而我使用post方法receive并希望使用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)
导入sqlite3 从烧瓶导入烧瓶,渲染\u模板 从flask_socketio导入socketio app=烧瓶(名称) app.config['SECRET\u KEY']='SECRET!' socketio=socketio(应用程序) @app.route('/',方法=['GET']) def index(): 呈现模板('index.html') #监听数据 @app.route('/listen/',methods=['POST']) def侦听(数据): #插入到数据库 conn=sqlite3.connect('storage.db') c=连接光标() c、 执行(“”“创建表信息(num text)”“”) c、 执行(“”“插入信息(num)值(?“”),(数据)) 康涅狄格州提交 康涅狄格州关闭 #向客户端发送警报 @socketio.on('消息') def句柄_消息(消息): 发送(消息) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': socketio.run(应用程序) 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>

var socket=io.connect('http://'+document.domain+':'+location.port);
socket.on('message',函数(数据){
控制台日志(数据);
});

你刚刚搞错了。您从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)
导入sqlite3 从烧瓶导入烧瓶,渲染\u模板 从flask_socketio导入socketio,发射 app=烧瓶(名称) app.config['SECRET\u KEY']='SECRET!' socketio=socketio(应用程序) @app.route('/',方法=['GET']) def index(): 呈现模板('index.html') #监听数据 @app.route('/listen/',methods=['POST']) def侦听(数据): #插入到数据库 conn=sqlite3.connect('storage.db') c=连接光标() c、 执行(“”“创建表信息(num text)”“”) c、 执行(“”“插入信息(num)值(?“”),(数据)) 康涅狄格州提交 康涅狄格州关闭 发出('message'、'Change's maked',broadcast=True)#发送所有收听者 #这一部分是,若客户端通过“消息”套接字向服务器发送某些内容。你不需要这个, #@socketio.on('message') #def句柄_消息(消息): #发送(消息) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': socketio.run(应用程序) 因为客户端侦听来自“message”套接字的消息,所以您需要在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>

var socket=io.connect('http://'+document.domain+':'+location.port);
socket.on('message',函数(数据){
控制台日志(数据);
});
客户端服务器端。 它们都使用
socket.on()
侦听某些更改。它们通过、
send()
emit()
发送消息或发出消息


客户端可以通过“ImHere”套接字发出->服务器将使用
套接字处理该消息。在('ImHere')
->服务器可以使用
emit
send
,比如说“message”套接字->客户端可以使用“socket.on”('message',function(data){…})来处理它.

您拥有@Dinko提到的一切,您只需在conn.close()之后的listen函数中再添加一个,即:

socketio.emit('message', {'data': 'Records Affected'}, broadcast=True)
您的回拨功能将被触发,因为它将听到“消息”套接字

这里要添加的另一件事是,如果您有特定通道的名称空间,那么您也需要传递该名称空间

socketio.emit('message', {'data': 'Records Affected'}, broadcast=True, namespace='/test')
希望这有帮助