【问题标题】:Flask Socket IO Responding with Timeout errorFlask Socket IO 响应超时错误
【发布时间】:2020-10-10 17:12:09
【问题描述】:

我试图在我的网页(实时)中始终从我的数据库中获得更新的表格。为此,我正在使用 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>

这是我的控制台错误:

谢谢,

乔纳森·普列托

【问题讨论】:

  • 能否发布完整的错误回溯?
  • @ngShravil.py ,我更改了一些代码并添加了完整的错误。在此更改中,我不再使用 jinja 模板进行迭代,而是使用 JS,因为在互联网上的所有示例中,都需要 JS 将套接字与前端 END 连接。

标签: javascript python flask websocket socket.io


【解决方案1】:

我不确定这是否有助于回答您的问题,但您无法更改 Request.sid 值,它是由服务器选择的...

【讨论】:

  • 谢谢@Tom Smithson,但这个错误可能是由于我在编程时犯的另一个错误,因为我从未更改过这个值。
  • @JonathanPrieto 好的,对不起,我帮不上什么忙!祝你好运!
【解决方案2】:

HTTP 503 错误表示请求解析存在错误。我不确定您是否正确设置了socketio,但请务必在需要时打开和关闭连接。

现在查看您的 sn-p,您调用 socketio.emit 函数并完成执行。问题是这个函数需要异步,所以你应该像这样使用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 在离开函数之前完成执行。

【讨论】:

  • 嗨,我想我遇到了同样的错误:at=error code=H12 desc="Request timeout" method=GET path="/socket.io/?EIO=3&amp;transport=polling&amp;t=NBKK4DZ&amp;sid=0b6e588d605d482d9ece183697950812" host=pruebas-intranet.herokuapp.com request_id=488455f2-a301-4d3d-ade4-e38f08aa3116 fwd="190.117.185.95" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https
  • 你打开服务器上的连接了吗?可以给我们完整的代码吗?
  • 好的@Unicone,我更新了我帖子中的python代码。
  • 您是否尝试在查询后记录consolidado_data 值以查看它们是否被正确查询?我不确定您是否已经处理过它,但如果 Consolidado.query.all() 是异步的,您应该使用 await 关键字等待数据被解析,然后发出它们。 consolidado_data = await Consolidado.query.all()
  • consolidado.query.all() 工作正常,我不确定它是否可行,但我在 Heroku 中运行我的代码,为此我生成了一个 Procfile,我不知道我是否应该也许改变它。现在是这样的:web: gunicorn app:app 我在 consolidado.query.all() 之前添加了等待,正如你所建议的那样,我有同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多