Flask使用websocket

前后端分离对于websocket就是个坑。。

想用websocket来搭建一个聊天室,前后端分离(高大上!?),这里记录一下走过的坑。
首先说明一下我遇到的问题:

websocket连connect都做不到,浏览器提示CORS问题,需要跨域头部,后台显示400状态访问

浏览器提示没有跨域头不一定就是CORS设置异常

在这里卡了许久,一直以为自己的跨域设置有问题
一般设置为

from flask_cors import CORS
...
CORS(app, supports_credentials=True, resources=r'/*')

就OK了,通过路由访问没问题,但websocket疯狂报错,网上跨域设置都尝试了下,没得用,暂时搁置
而且最后找到问题后,不用设置跨域就能访问??(搞不懂

分析github已有项目,来找茬

最后是在这里解决的,gayhub上的源码一般clone下来都能跑,就将后端替换成自己的项目
最后我的解决方案是,更换为旧版本

---------------- -------
aniso8601        8.0.0
Click            7.0
dnspython        1.16.0
eventlet         0.19.0
Flask            1.1.1
Flask-Cors       3.0.8
Flask-HTTPAuth   3.3.0
Flask-RESTful    0.3.7
Flask-SocketIO   2.4 <--最新的不行,这个就可以
Flask-SQLAlchemy 2.4.1
greenlet         0.4.15
itsdangerous     1.1.0
Jinja2           2.10.3
MarkupSafe       1.1.1
monotonic        1.5
passlib          1.7.2
pip              19.3.1
pkg-resources    0.0.0
PyMySQL          0.9.3
python-engineio  0.9.1<--也要换成相应
python-socketio  1.3<--配套的版本
pytz             2019.3
setuptools       39.0.1
six              1.13.0
SQLAlchemy       1.3.11
Werkzeug         0.16.0

最后附上测试代码

from flask import Flask, jsonify
from flask_socketio import SocketIO, emit
import eventlet


eventlet.monkey_patch()

app = Flask(__name__)
socketio = SocketIO(app)


@app.route('/')
def index():
    return jsonify({'message': 'Index page'})


@socketio.on('connect')
def socketio_connect():
    print('Client has connected to the backend')
    emit('event', {'message': 'ACK'})


@socketio.on('event')
def socketio_message_event(message):
    print('Received event: ' + str(message))
    emit('response', {'message': 'Copy that'})


@socketio.on('response')
def socketio_message_response(message):
    print('Received response: ' + str(message))


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

来源:https://github.com/Celeo/Vue-Flask-WebSockets

你可能感兴趣的:(Flask使用websocket)