VueJS 客户端无法连接到 Flask 服务器

VueJS client cannot connect to Flask server

所以我正在创建一个应用程序,它使用 SocketIO 将常量消息从服务器(由 Flask 提供支持)流式传输到客户端(由 Vue 提供支持)。但是,到目前为止,我一直没有成功。这是我使用的最小设置:

app.py

from flask import Flask
import eventlet
from flask_socketio import SocketIO

class CustomFlask(Flask):
    jinja_options = Flask.jinja_options.copy()
    jinja_options.update(dict(
        variable_start_string='{$',  # Default is '{{', I'm changing this because Vue.js uses '{{' / '}}'
        variable_end_string='$}',
    ))

app = CustomFlask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@socketio.on('testing')
def testing(msg):
    print(msg)

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

App.vue

<template>
  <div id="app">
    <Test/>
  </div>
</template>

<script>
import Test from './components/Test.vue'

export default {
  name: 'app',
  components: {
    Test
  }
}
</script>

Test.vue

<template>
    <div>
        This is a test
        <button @click="testing">Test socket!</button>
    </div>
</template>

<script>
    export default {
        name: 'Test',
        methods: {
            testing() {
                this.$socket.client.emit('testing', 'Test string')
            }
        }
    }
</script>

main.js

这是Vue的挂载JS文件

import Vue from 'vue'
import App from './App.vue'
import VueSocketIOExt  from 'vue-socket.io-extended';
import io from 'socket.io-client';

const socket = io('http://' + document.domain + ':' + location.port)
Vue.use(VueSocketIOExt, socket);

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  sockets: {
    testing() {
      console.log('Tested socket for client!')
    }
  }
}).$mount('#app')

vue.config.js

module.exports = {
    devServer: {
        proxy: {
            '/socket.io': {
                target: 'http://localhost:5000',
                ws: true,
                changeOrigin: true,
            }
        }
    }
}

我在检查控制台时经常遇到的错误是:

  1. failed: Error during WebSocket handshake: Unexpected response code: 400

  2. 基本上是 GET 请求上的 400 (BAD REQUEST) 代码

最新版本的 Flask-SocketIO 配置了关于跨源设置的最安全设置,即只允许同源。如果您的 Vue 应用程序和 Flask 应用程序 运行 在不同的端口上,那么您必须配置跨源。

例如,如果您的 Vue 应用托管在 http://localhost:8080,您可以允许它作为来源:

socketio = SocketIO(app, cors_allowed_origins='http://localhost:8080')