Колба не может получить сообщение от socketio - PullRequest
0 голосов
/ 21 апреля 2019

————————————————— вопрос update2 ————————————————

Привет всем, мой вопрос исправлен. Спасибо Мигелю. его предложение очень полезно. В мае обновление2 я забыл @ в моем маршруте: @socketio.on().

————————————————— оригинальный вопрос ————————————————

Я написал сервер с флягой, и мне нужен способ ajax моих данных, я выбрал socketio. мой флодер такой:

/mysite
..runserver.py
....__init__.py
....views.py
../templates
....dice.html

в runserver.py

from mysite import app
from flask_socketio import SocketIO
socketio = SocketIO(app)
if __name__ == '__main__':
    socketio.run(app)

in init .py

from flask_socketio import SocketIO

app = Flask(__name__)
socketio = SocketIO(app)

в просмотрах

from mysite import app,socketio

@app.route('/dice',methods = ['GET','POST'])
def dice():
    return render_template('dice.html', form=form)

@socketio.on('DiceRequest',namespace='/dice')
def diceResult(message):
    emit('DiceResult',{'data':message['data']})

в dice.html

<script>
    $(document).ready(function () {
        namespace = '/dice';
        var socket = io.connect('http://localhost:' + '5000' + namespace);
        socket.on('DiceResult', function (msg) {
            $('#log').append('<br><input type="text">' + $('<div/>').text(msg.data).html());
        });
        $('form#emit').submit(function (event) {
            socket.emit('DiceRequest', { data: $('#emit_data').val() });
            return false;
        });
    });
</script>
    <form id="emit" method="POST" action='#'>
        <input type="text" name="emit_data" id="emit_data" placeholder="Message">
        <input type="submit" value="Echo">
    </form>
<h2>Receive:</h2>
<div id="log"></div>

я могу поймать данные http пакета вот так

REQUEST:
Request URL: http://localhost:5000/socket.io/?EIO=3&transport=polling&t=1555859308868-6&sid=7227db4c2a424529b365c70e631f7a89
Request Method: POST
Status Code: 200 OK
Remote Address: 127.0.0.1:5000
Referrer Policy: no-referrer-when-downgrade

HEADER:
Content-type: text/plain;charset=UTF-8
Origin: http://127.0.0.1:5000
Referer: http://127.0.0.1:5000/dice
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

DATA:
36:42/dice,["DiceRequest",{"data":"2"}]


RESPONSE:
HEADER:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://127.0.0.1:5000
Connection: close
Content-Type: text/plain
Date: Sun, 21 Apr 2019 15:08:29 GMT
Server: Werkzeug/0.15.2 Python/3.6.8

DATA:
OK

когда я устанавливаю точку останова в views.pydef diceResult (message) :, я не могу сломать свою программу. поэтому я думаю, что моя обратная точка не может получить мои данные.

———————————————— Вопрос update1 ————————————————

Я пытаюсь переписать свой код, как советует Мигель, но я все еще не могу получить данные. код здесь __init__.py

from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)

runserver.py

from mysite import app,socketio
socketio.run(app)

views.py

@app.route('/dice',methods=['GET','POST'])
def dice():
    form = diceForm()
    return render_template('dice.html',form=form)

socketio.on('DiceRequest',namespace='/dice')
def DiceResult(message):
    emit('DiceResult',{'data':message['data']})

и мой dice.html вот так

<head>
    <script type="text/javascript" src="//code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
    <script type="text/javascript" charset="utf-8">
        $(document).ready(function () {
            namespace = '/dice';
            var socket = io.connect('http://localhost:' + '5000' + namespace);
            socket.on('DiceResult', function (msg) {
                $('#log').append('<br>' + $('<div/>').text('Received #' + msg.count + ': ' + msg.data).html());
            });
            $('form#emit').submit(function (event) {
                socket.emit('DiceRequest', { data: $('#emit_data').val() });
                return false;
            });
        });
    </script>
</head>
<body>
<form id="emit" method="POST" action='#'>
    <input type="text" name="emit_data" id="emit_data" placeholder="Message">
    <input type="submit" value="Echo">
</form>
<h2>Receive:</h2>
<div id="log"></div>
</body>
...