前后端分离对于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)
网友评论