将简单的 Socket.io Flask 应用程序部署到 Google App Engine:仍未解决

Posted

技术标签:

【中文标题】将简单的 Socket.io Flask 应用程序部署到 Google App Engine:仍未解决【英文标题】:Deploying Simple Socket.io Flask App To Google App Engine: Still Unsolved 【发布时间】:2021-01-14 14:39:55 【问题描述】:

我正在尝试部署一个使用 socket.io 来托管小型实时聊天网站的小型烧瓶应用程序

我能够在本地成功运行它(127.0.0.1)

然后我使用以下文件将其部署到谷歌应用引擎:

main.py

from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__)
app.config['SECRET_KEY'] = 'vnkdjnfjknfl1232#'
socketio = SocketIO(app)


@app.route('/')
def sessions():
    return render_template('session.html')

def messageReceived(methods=['GET', 'POST']):
    print('message was received!!!')

@socketio.on('my event')
def handle_my_custom_event(json, methods=['GET', 'POST']):
    print('received my event: ' + str(json))
    socketio.emit('my response', json, callback=messageReceived)

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

app.yaml

runtime: python

network:
  session_affinity: true

requirements.txt

Flask==0.12.2
flask-socketio
eventlet==0.17.4
gunicorn==18.0.0

还有一个功能齐全的 HTML 页面,其中包含以下脚本:

    <form action="" method="POST">
      <input type="text" class="username" placeholder="User Name"/>
      <input type="text" class="message" placeholder="Messages"/>
      <input type="submit"/>
    </form>

    <!-- jQuery (necessary for Bootstrap's javascript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
    <script type="text/javascript">
      var socket = io.connect('https://' + document.domain + ':' + location.port);

      socket.on( 'connect', function() 
        socket.emit( 'my event', 
          data: 'User Connected'
         )
        var form = $( 'form' ).on( 'submit', function( e ) 
          e.preventDefault()
          let user_name = $( 'input.username' ).val()
          let user_input = $( 'input.message' ).val()
          socket.emit( 'my event', 
            user_name : user_name,
            message : user_input
           )
          $( 'input.message' ).val( '' ).focus()
         )
       )
      socket.on( 'my response', function( msg ) 
        console.log( msg )
        if( typeof msg.user_name !== 'undefined' ) 
          $( 'h3' ).remove()
          $( 'div.message_holder' ).append( '<div><b style="color: #000">'+msg.user_name+'</b> '+msg.message+ "\n" + '</div>' )
        
      )
    </script>

这是链接,您可以查看发生了什么:https://flask-chat-for-mckenna.wl.r.appspot.com/

更新

将端点从 HTTP 更改为 HTTPS 后,我不再收到 405(感谢 Simeon Nedkov!) 好像连接有问题?停止缓冲需要比平时更长的时间

所有代码都是最新的

提前致谢!

【问题讨论】:

【参考方案1】:

错误通知您浏览器拒绝访问不安全的端点。

当通过https://... 提供的页面尝试访问位于http://... 的资源时,就会发生这种情况。

幸运的是,在这种情况下,您可以控制不安全的端点,并且可以通过更改来解决问题

var socket = io.connect('http://' + document.domain + ':' + location.port);

var socket = io.connect('https://' + document.domain + ':' + location.port);

【讨论】:

修复了 405 响应,谢谢!我仍然遇到一些问题,所以我将更新我的问题,但你帮了很多忙。

以上是关于将简单的 Socket.io Flask 应用程序部署到 Google App Engine:仍未解决的主要内容,如果未能解决你的问题,请参考以下文章

Flask socket.IO 服务器上的 Node.js Socket.io 客户端

Flask:无法从 socket.io 监听器中访问 c​​urrent_app

在 Flask Socket IO 聊天中设置动态聊天室

flask_socket.io _ 运行异步任务的问题

用 Python flask_socketio 反应 socket.io-client 不处理事件

Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时