Базовая реализация flask-socketio не работает; нет вывода или ошибок

Я пытаюсь включить socketio в свой проект фляги. Прямо сейчас я пытаюсь получить простой вывод с сервера «Подключен» или «Отключен». Однако, когда я запускаю сценарий приложения с «python app.py», я не получаю ни этих сообщений, ни каких-либо ошибок, указывающих мне в каком-либо направлении.

Никогда не думал, что пропущу ошибки!

app.py

from flask import Flask, render_template, request, url_for, copy_current_request_context
from flask_socketio import SocketIO, emit
import logging

logging.basicConfig()

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
socketio = SocketIO(app)

@app.route('/scan/')
def waitForRFID():
    return render_template('scan.html')    

@socketio.on('connect', namespace='/test')
def test_connect():
    print('Client connected')

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')

if __name__ == '__main__':
    socketio.run(app)

scan.html

<!doctype html>
<meta name="viewport" content="width=device-width, initial-scale=1">
<head>
    <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
    <script src="{{ url_for('static', filename = 'js/scan.js') }}"></script>
    <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/scan.css') }}" />
</head>

scan.js

$(document).ready(function(){
    //connect to the socket server.
    var socket = io.connect('http://' + document.domain + ':' + location.port + '/test');
});

Когда я запускаю файл app.py и посещаю 127.0.0.1:5000/scan/, я получаю в терминале следующий вывод:

127.0.0.1 - - [2018-02-11 16:42:10] "GET /scan/ HTTP/1.1" 200 812 0.010323

Веб-страница загружается правильно, и я получаю тот же результат, если запускаю ее в виртуальной среде или из нее.

Что может быть не так с такой простой настройкой? Заранее спасибо!


person SorenLantz    schedule 11.02.2018    source источник


Ответы (1)


Пытаясь воспроизвести вашу проблему с данной настройкой, я заметил следующую ошибку в консоли Javascript:

scan.js:1 Uncaught ReferenceError: $ is not defined
    at scan.js:1

В вашем примере не загружен jQuery, поэтому ваш scan.js не может подключиться к сокету после завершения загрузки документа.

Вы можете добавить jQuery, включив ссылку на CDN ниже:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

И тогда мы видим, что пример работает:

127.0.0.1 - - [2018-02-12 07:53:58] "GET /scan/ HTTP/1.1" 200 521 0.010458
127.0.0.1 - - [2018-02-12 07:53:58] "GET /static/css/scan.css HTTP/1.1" 404 342 0.001086
127.0.0.1 - - [2018-02-12 07:53:58] "GET /static/css/scan.css HTTP/1.1" 404 342 0.000776
127.0.0.1 - - [2018-02-12 07:53:58] "GET /socket.io/?EIO=3&transport=polling&t=1518393238311-0 HTTP/1.1" 200 345 0.000879
Client connected
127.0.0.1 - - [2018-02-12 07:53:58] "POST /socket.io/?EIO=3&transport=polling&t=1518393238776-1&sid=7d98901d0ef74164975ee5464879ba19 HTTP/1.1" 200 195 0.000818
127.0.0.1 - - [2018-02-12 07:53:58] "GET /socket.io/?EIO=3&transport=polling&t=1518393238778-2&sid=7d98901d0ef74164975ee5464879ba19 HTTP/1.1" 200 198 0.000201
person Matt Healy    schedule 11.02.2018
comment
Спасибо за ответ. Я добавил вызов jQuery в файл scan.html, но все равно получаю тот же результат. Глядя на опубликованный вами вывод, я заметил, что мой скрипт не выполняет (или, по крайней мере, не сообщает) GET для таблицы стилей css или socket.io. Какие библиотеки вы установили для своей установки? - person SorenLantz; 12.02.2018
comment
Я использую Python 3.6.0 и установил в своей виртуальной среде: click == 6.7 Flask == 0.12.2 Flask-SocketIO == 2.9.3 itsdangerous == 0.24 Jinja2 == 2.10 MarkupSafe == 1.0 python-engineio = = 2.0.2 python-socketio == 1.8.4 six == 1.11.0 Werkzeug == 0.14.1 Я бы порекомендовал вам проверить свою веб-консоль, чтобы узнать, почему файлы JS и CSS не обрабатываются - person Matt Healy; 12.02.2018
comment
Я попробую воспроизвести эти библиотеки в новом виртуальном окружении. Кроме того, я использую ssh в своем Raspberry Pi, чтобы написать этот код и посмотреть на результат. Как мне отлаживать с помощью веб-консоли? - person SorenLantz; 12.02.2018
comment
Чтобы использовать веб-сокеты, вам необходимо получить удаленный доступ к IP-адресу raspberry pi с помощью веб-браузера - или вы используете веб-браузер на самом пи? Большинство веб-браузеров поставляются со встроенной веб-консолью, и это то, что вы должны использовать, чтобы видеть ошибки на стороне клиента (например, ошибки javascript, внешние ресурсы не загружаются) - person Matt Healy; 12.02.2018