Flask Socket IO отвечает с ошибкой тайм-аута - PullRequest
1 голос
/ 20 июня 2020

Я стараюсь всегда иметь обновленную таблицу из моей базы данных на моей веб-странице (в реальном времени). Для этого я использую Flask и SocketIO. Но я получаю следующую ошибку:

at=error code=H12 desc="Request timeout" method=GET path="/socket.io/?EIO=3&transport=polling&t=NBIyASy&sid=bc2f86d8b04c4304aaf2a76211b3b6fa" host=pruebas-intranet.herokuapp.com request_id=2f725719-befa-4b1e-ba7b-5c025ad34a87 fwd="190.117.185.95" dyno=web.1 connect=1ms service=30001ms status=503 bytes=0 protocol=https

Здесь вы можете увидеть код, который я использую в flask:

from flask_socketio import SocketIO, emit, send

if(os.environ.get('DATABASE_URL') is None):
    raise Exception("Esta Faltando la variable: DATABASE_URI")

app = Flask(__name__)
app.secret_key = “…”

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL')

db = SQLAlchemy(app)

socketio = SocketIO(app)

from models import User

login_manager = LoginManager()
login_manager.login_view = 'login_post'
login_manager.init_app(app)
login_manager.login_message = u"Por favor ingrese sus credenciales."

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@socketio.on('solicitudes_id')
async def broad_consolidado():
    consolidado_data = Consolidado.query.all()
    await socketio.emit('consolidado', consolidado_data, namespace='/consolidado')

@app.route('/consolidado')
@login_required
def show_consolidado():
    return render_template("consolidado.html")

if __name__ == "__main__":
    socketio.run(app, debug=True)

А на моей стороне HTML я использовал как часть моего кода JS, чтобы показать таблицу:

            <div style="overflow: auto">
 

                <table id="dtHorizontalExample" class="table table-striped table-bordered table-sm" cellspacing="0" width="100%">
                    <thead>
                        <tr>
                            <th>solicitudes_id</th>
                            <th>id_user</th>
                            <th>tipouso</th>
                            <th>tipoauto</th>
                            <th>credito</th>
                            <th>entidadcrediticia</th>
                            <th>id_auto</th>
                            <th>fecha</th>
                            <th>canalinput</th>
                            <th>ciudadcompra</th>
                            <th>hora</th>
                            <th>nombre</th>
                            <th>appellidos</th>
                            <th>numdocumento</th>
                            <th>numtelefono</th>
                            <th>correo</th>
                            <th>tipolicencia</th>
                            <th>tiempolicencia</th>
                            <th>trabajoaplicativo</th>
                            <th>tipodocumento</th>
                        </tr>
                    </thead>

                    <tbody>

                        <script type="text/javascript">
                              var socket = io.connect('https://' + document.domain + ':' + location.port);
                              socket.on( 'consolidado', function( consolidado ) {
                                  for (var i = 0; i < consolidado.length; i++) {
                                        console.log( consolidado[i].solicitudes_id );
                                        $( 'tbody' ).append('<tr> <td>'+
                                            consolidado[i].solicitudes_id+ '</td> <td>'+
                                            consolidado[i].id_user+'</td> <td>' +
                                            consolidado[i].tipouso+ '</td> <td>'+
                                            consolidado[i].tipoauto+'</td> <td>'+
                                            consolidado[i].credito+ '</td> <td>'+
                                            consolidado[i].entidadcrediticia+'</td> <td>'+
                                            consolidado[i].id_auto+'</td> <td>'+
                                            consolidado[i].fecha+'</td> <td>'+
                                            consolidado[i].canalinput+'</td> <td>'+
                                            consolidado[i].ciudadcompra+'</td> <td>'+
                                            consolidado[i].hora+'</td> <td>'+
                                            consolidado[i].nombre+'</td> <td>'+
                                            consolidado[i].appellidos+'</td> <td>'+
                                            consolidado[i].numdocumento+'</td> <td>'+
                                            consolidado[i].numtelefono+'</td> <td>'+
                                            consolidado[i].correo+'</td> <td>'+
                                            consolidado[i].tipolicencia+'</td> <td>'+
                                            consolidado[i].tiempolicencia+'</td> <td>'+
                                            consolidado[i].trabajoaplicativo+'</td> <td>'+
                                            consolidado[i].tipodocumento+'</td> </tr>')
                                }
                              })
                        </script>

                    </tbody>
 
 
                </table>
            </div>

Вот мои ошибки консоли:

введите описание изображения здесь

Спасибо,

Джонатан Прието

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Ошибка HTTP 503 означает, что произошла ошибка при разрешении запроса. Я не уверен, что вы правильно настроили socketio, но обязательно открывайте и закрывайте соединение, когда это необходимо.

Теперь, глядя на свой фрагмент, вы вызываете функцию socketio.emit и завершаете sh выполнение. Проблема в том, что эта функция должна быть асинхронной c, поэтому вы должны использовать ключевые слова async/await, например,

@socketio.on('solicitudes_id')
async def broad_consolidado():
    consolidado_data = Consolidado.query.all()
    await socketio.emit('consolidado', consolidado_data, namespace='/consolidado')

Таким образом вы гарантируете выполнение socketio.emit fini sh перед выходом из функции.

0 голосов
/ 20 июня 2020

Не уверен, что это поможет ответить на ваш вопрос, но вы не можете изменить значение Request.sid, оно выбирается сервером ...

...