Как отправить уведомление клиенту с помощью веб-сокетов после отправки запроса в колбу - PullRequest
0 голосов
/ 11 ноября 2018

Как отправить сообщение клиенту после отправки запроса? Я сохраняю данные из почтового запроса в базу данных и хочу уведомить клиента об изменении базы данных. Есть ли способ объединить RestaPI с WebSocket? примеры, которые я нахожу, используют веб-сокеты для получения данных и отправки клиенту, в то время как я использую метод post-receive и хочу использовать веб-сокет для оповещения. любая помощь будет оценена.

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>

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

У вас есть все места, как упомянуто @Dinko, вам просто нужно добавить еще одну в вашу функцию прослушивания после conn.close (), которая:

socketio.emit('message', {'data': 'Records Affected'}, broadcast=True)

Ваша функция обратного вызова будет активирована, поскольку она услышит сокет «сообщения».

Еще одна вещь, которую нужно добавить, это то, что, если у вас есть пространство имен для определенного канала, вам нужно также передать это

socketio.emit('message', {'data': 'Records Affected'}, broadcast=True, namespace='/test')

Надеюсь, это поможет ..!

0 голосов
/ 11 ноября 2018

Вы просто неправильно поняли. Ваш send или emit от flask-socketio должен быть последним оператором после запроса 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)

Поскольку клиент прослушивает сообщения из сокета '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>

Существует на стороне клиента и на стороне сервера . Они оба слушают некоторые изменения с socket.on(). И они отправляют сообщения или отправляют сообщения с send() и emit().

Клиент может отправлять через сокет «ImHere» -> сервер будет обрабатывать это сообщение с помощью socket.on('ImHere') -> сервер может запустить другой сокет, с помощью emit или send, скажем, сокет «message» -> клиент может обработать его на своей стороне с помощью `socket.on ('message', function (data) {...}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...